diff --git a/README.md b/README.md index 95d66cff..d996ba88 100644 --- a/README.md +++ b/README.md @@ -3,92 +3,222 @@ [![Circle CI](https://circleci.com/gh/ARMmbed/dapjs.svg?style=shield&circle-token=d37ef109d0134f6f8e4eb12a65214a8b159f77d8)](https://circleci.com/gh/ARMmbed/dapjs/) [![License](https://img.shields.io/badge/License-MIT-blue.svg)](https://spdx.org/licenses/MIT.html) -DAP.js is a JavaScript interface to CMSIS-DAP, aiming to implement a subset of -the functionality provided by [pyOCD](https://github.com/mbedmicro/pyOCD), enabling -debugging of Arm Cortex-M devices in Node.js and in the browser using [WebUSB](https://developers.google.com/web/updates/2016/03/access-usb-devices-on-the-web). - -## Features - -- General - - Read core registers - - Run arbitrary assembled Arm machine code -- Debugging - - Set hardware and software breakpoints - - Step (instruction level) -- Memory - - Read blocks from memory: - - 16-bit reads/writes - - 32-bit reads/writes - - Word-aligned mass reads and writes -- Flashing - - Full-chip erase - - Flash binary files and intel hex files - - Support for the NRF51 (including the micro:bit) and NXP's FRDM-K64F. -- Performance - - Support for batched commands to improve HID report utilisation - - Flashing at ~10-20 kB/s, comparable with PyOCD and OpenOCD +DAP.js is a JavaScript interface to [CMSIS-DAP](https://www.keil.com/pack/doc/CMSIS/DAP/html/index.html), enabling access to Arm Microcontrollers using [Node.js](https://nodejs.org/) or in the browser using [WebUSB](https://wicg.github.io/webusb/). ## Prerequisites -[Node.js > v8.9.0](https://nodejs.org), which includes `npm 5`. +[Node.js > v6.10.0](https://nodejs.org), which includes `npm`. ## Installation -The SDK is distributed using npm. To install the package in your project: +The package is distributed using npm. To install the package in your project: - $ npm install dapjs +```bash +$ npm install dapjs +``` + +## Getting Started + +Decide on a transport layer to use (see below) and refer to the [examples folder](https://github.com/ARMmbed/dapjs/tree/master/examples/) to get started. + +The web example can be seen running at: + +https://armmbed.github.io/dapjs/examples/daplink-flash/web.html + +Refer to the [DAPjs API Documentation](https://armmbed.github.io/dapjs/) for more information. + +## Choosing a Transport + +In order to use DAPjs, you need to install support for one of the transports. Use the following information to help you choose which to use: + +### WebUSB -## Development setup +If you wish to use DAPjs in a browser environment, you must use WebUSB. Please refer to the [implementation status](https://github.com/WICG/webusb#implementation-status) of WebUSB to understand browser support for this technology. -After cloning this repository: +__Note:__ WebUSB in the browser doesn't require any further libraries to be installed. - $ npm install +If you also want your program to work in a Node.js environment a [WebUSB library](https://github.com/thegecko/webusb) exists to allow your program to be ported to Node.js. -Then run one of the gulp commands: +To install the library for Node.js, use: - $ gulp - $ gulp watch - $ npm run gulp +```bash +$ npm install webusb +``` + +#### Example -## Examples +In the browser, require the library: -For more full-featured examples, please refer to the [examples](https://github.com/ARMmbed/dapjs/tree/master/examples) folder and see the web example running at: +```html + +``` -https://armmbed.github.io/dapjs/ +In Node.js Require the libraries: ```javascript -device = await navigator.usb.requestDevice({ - filters: [{vendorId: 0x0d28}] +const usb = require("webusb").usb; +const DAPjs = require("dapjs"); +``` + +Then in either environment: + +```javascript +.usb.requestDevice({ + filters: [{vendorId: 0xD28}] +}) +.then(device => { + const transport = new DAPjs.WebUSB(device); + const daplink = new DAPjs.DAPLink(transport); + + return daplink.connect() + .then(() => daplink.disconnect()) + .then(() => process.exit()); +}) +.catch(error => { + console.error(error.message || error); + process.exit(); }); +``` + +#### Pros +- Works in the browser +- Programs are portable to Node.js environments -this.deviceCode = device.serialNumber.slice(0, 4); -selector = new DAPjs.PlatformSelector(); -const info = await selector.lookupDevice(this.deviceCode); -this.hid = new DAPjs.HID(device); - -// open hid device -await this.hid.open(); -dapDevice = new DAPjs.DAP(this.hid); -// contains flash algorithms data and memory map -let flashAlgorithmsData = {}; -let flashAlgorithm = new DAPjs.FlashAlgorithm(flashAlgorithmsData, this.deviceCode); -this.target = new DAPjs.FlashTarget(dapDevice, flashAlgorithm); - -// init and halt target -await this.target.init(); -await this.target.halt(); - -// program_data contains binary data -program_data = DAPjs.FlashProgram.fromBinary(0, program_data); -await this.target.program(program_data, (progress) => { - console.log(progress); +#### Cons +- Requires a recent version of [DAPLink](https://armmbed.github.io/DAPLink/) to be installed on your target device. + +### HID + +For the highest level of firmware compatibility in a Node.js environment, the HID transport is recommended. This utilises the `node-hid` library and is installed as follows: + +```bash +$ npm install node-hid +``` + +#### Example + +```javascript +const hid = require("node-hid"); +const DAPjs = require("dapjs"); + +let devices = hid.devices(); +devices = devices.filter(device => device.vendorId === 0xD28); + +const transport = new DAPjs.HID(devices[0]); +const daplink = new DAPjs.DAPLink(transport); + +daplink.connect() +.then(() => daplink.disconnect()) +.then(() => process.exit()) +.catch(error => { + console.error(error.message || error); + process.exit(); }); +``` + +#### Pros +- Compatible with older CMSIS-DAP firmware. + +#### Cons +- Requires HID access to JavaScript in your OS. + +### USB -await this.target.reset(); +A "pure" USB transport exists which bypasses requiring `WebUSB` and `HID`. +This utilises the `usb` library and is installed as follows: + +```bash +$ npm install usb ``` -## Documentation +#### Example + +```javascript +const usb = require("usb"); +const DAPjs = require("dapjs"); + +let devices = usb.getDeviceList(); +devices = devices.filter(device => device.deviceDescriptor.idVendor === 0xD28); -API documentation can be viewed at: +const transport = new DAPjs.USB(devices[0]); +const daplink = new DAPjs.DAPLink(transport); -https://armmbed.github.io/dapjs/docs/ +daplink.connect() +.then(() => daplink.disconnect()) +.then(() => process.exit()) +.catch(error => { + console.error(error.message || error); + process.exit(); +}); +``` + +#### Pros +- Doesn't require HID access to JavaScript in your OS. + +#### Cons +- Requires a recent version of [DAPLink](https://armmbed.github.io/DAPLink/) to be installed on your target device. + +## Architecture + +The architecture of this project is built up in layers as follows: + +### Transport + +The `Transport` layer offers access to the USB device plugged into the host. Different transports are available based on user needs (see above). + +### Proxy + +The `Proxy` layer uses the transport layer to expose low-level `CMSIS-DAP` commands to the next layer. A common use for the proxy is as a debug chip attached to the main processor accessed over USB. + +A CMSIS-DAP implementation is included, however a network proxy or similar could be introduced at this layer in order to remote commands. + +### DAPLink + +The `DAPLink` layer is a special derived implementation of the `CMSIS-DAP` proxy implementation. It adds DAPLink vendor specific functionality such as Mass Storage Device `firmware flashing` and `serial control`. + +### DAP + +The `DAP` (Debug Access Port) layer exposes low-level access to ports, registers and memory. An implementation exists for `ADI` (Arm Debug Interface). + +### Processor + +The `Processor` layer exposes access to the core processor registers. + +## Development + +After cloning this repository, install the development dependencies: + +```bash +$ npm install +``` + +### Building + +[Gulp](https://gulpjs.com/) is used as a task runner to build the project. +To build the project, simply run `gulp` or to continually build as source changes, run `gulp watch`: + +```bash +$ gulp +$ gulp watch +``` + +A `package.json script` exists to run gulp if you don't have it installed globally: + +```bash +$ npm run gulp +$ npm run gulp watch +``` + +### Running + +A local [express](https://expressjs.com/) server is included to run the web example locally: + +```bash +$ node server.js +``` + +The latest build of master is always available to be installed from the `gh-pages` branch: + +```bash +$ npm install ARMmbed/dapjs#gh-pages +``` diff --git a/binaries/k64f-blinky-green.bin b/binaries/k64f-green.bin similarity index 100% rename from binaries/k64f-blinky-green.bin rename to binaries/k64f-green.bin diff --git a/binaries/k64f-blinky-red.bin b/binaries/k64f-red.bin similarity index 100% rename from binaries/k64f-blinky-red.bin rename to binaries/k64f-red.bin diff --git a/binaries/microbit-say-green.hex b/binaries/microbit-green.hex similarity index 100% rename from binaries/microbit-say-green.hex rename to binaries/microbit-green.hex diff --git a/binaries/microbit-say-red.hex b/binaries/microbit-red.hex similarity index 100% rename from binaries/microbit-say-red.hex rename to binaries/microbit-red.hex diff --git a/binaries/nrf51dk-led-green.hex b/binaries/nrf51dk-green.hex similarity index 100% rename from binaries/nrf51dk-led-green.hex rename to binaries/nrf51dk-green.hex diff --git a/binaries/nrf51dk-led-red.hex b/binaries/nrf51dk-red.hex similarity index 100% rename from binaries/nrf51dk-led-red.hex rename to binaries/nrf51dk-red.hex diff --git a/circle.yml b/circle.yml index 751b6bf7..7dce7c45 100644 --- a/circle.yml +++ b/circle.yml @@ -1,33 +1,46 @@ -machine: - node: - version: 6.10.0 - environment: - LIVE_BRANCH: gh-pages +version: 2 -dependencies: - pre: - - sudo apt-get update - - sudo apt-get install libudev-dev +jobs: + build: + docker: + - image: circleci/node:6 + steps: + - run: sudo apt-get update + - run: sudo apt-get install libudev-dev + - run: sudo apt-get install libusb-1.0-0-dev + - checkout + - run: npm install + - run: npm run gulp + - persist_to_workspace: + root: ../ + paths: + - project -compile: - override: - - npm run gulp + deploy: + docker: + - image: circleci/node:6 + steps: + - attach_workspace: + at: ../ + - run: mkdir ~/.ssh/ && echo -e "Host github.com\n\tStrictHostKeyChecking no\n" > ~/.ssh/config + - run: git config --global user.name thegecko + - run: git config --global user.email github@thegecko.org + - run: git add --force bundles lib types docs + - run: git stash save + - run: git checkout gh-pages + - run: git merge master --no-commit + - run: git checkout stash -- . + - run: git commit --allow-empty --message "Automatic Deployment [skip ci]" + - run: git push -test: - override: - - exit 0 - -deployment: - staging: - branch: master - commands: - - echo Syncing to $LIVE_BRANCH on GitHub... - - git config --global user.name thegecko - - git config --global user.email github@thegecko.org - - git add --force bundles lib types docs - - git stash save - - git checkout $LIVE_BRANCH - - git merge master --no-commit - - git checkout stash -- . - - git commit --allow-empty --message "Automatic Deployment [skip ci]" - - git push +workflows: + version: 2 + commit: + jobs: + - build + - deploy: + requires: + - build + filters: + branches: + only: master diff --git a/src/theme/layouts/default.hbs b/docs-theme/layouts/default.hbs similarity index 100% rename from src/theme/layouts/default.hbs rename to docs-theme/layouts/default.hbs diff --git a/src/theme/partials/analytics.hbs b/docs-theme/partials/analytics.hbs similarity index 100% rename from src/theme/partials/analytics.hbs rename to docs-theme/partials/analytics.hbs diff --git a/src/theme/partials/breadcrumb.hbs b/docs-theme/partials/breadcrumb.hbs similarity index 100% rename from src/theme/partials/breadcrumb.hbs rename to docs-theme/partials/breadcrumb.hbs diff --git a/src/theme/partials/comment.hbs b/docs-theme/partials/comment.hbs similarity index 100% rename from src/theme/partials/comment.hbs rename to docs-theme/partials/comment.hbs diff --git a/src/theme/partials/footer.hbs b/docs-theme/partials/footer.hbs similarity index 100% rename from src/theme/partials/footer.hbs rename to docs-theme/partials/footer.hbs diff --git a/src/theme/partials/header.hbs b/docs-theme/partials/header.hbs similarity index 100% rename from src/theme/partials/header.hbs rename to docs-theme/partials/header.hbs diff --git a/src/theme/partials/hierarchy.hbs b/docs-theme/partials/hierarchy.hbs similarity index 100% rename from src/theme/partials/hierarchy.hbs rename to docs-theme/partials/hierarchy.hbs diff --git a/src/theme/partials/index.hbs b/docs-theme/partials/index.hbs similarity index 100% rename from src/theme/partials/index.hbs rename to docs-theme/partials/index.hbs diff --git a/src/theme/partials/member.declaration.hbs b/docs-theme/partials/member.declaration.hbs similarity index 100% rename from src/theme/partials/member.declaration.hbs rename to docs-theme/partials/member.declaration.hbs diff --git a/src/theme/partials/member.getterSetter.hbs b/docs-theme/partials/member.getterSetter.hbs similarity index 100% rename from src/theme/partials/member.getterSetter.hbs rename to docs-theme/partials/member.getterSetter.hbs diff --git a/src/theme/partials/member.hbs b/docs-theme/partials/member.hbs similarity index 100% rename from src/theme/partials/member.hbs rename to docs-theme/partials/member.hbs diff --git a/src/theme/partials/member.signature.body.hbs b/docs-theme/partials/member.signature.body.hbs similarity index 100% rename from src/theme/partials/member.signature.body.hbs rename to docs-theme/partials/member.signature.body.hbs diff --git a/src/theme/partials/member.signature.title.hbs b/docs-theme/partials/member.signature.title.hbs similarity index 100% rename from src/theme/partials/member.signature.title.hbs rename to docs-theme/partials/member.signature.title.hbs diff --git a/src/theme/partials/member.signatures.hbs b/docs-theme/partials/member.signatures.hbs similarity index 100% rename from src/theme/partials/member.signatures.hbs rename to docs-theme/partials/member.signatures.hbs diff --git a/src/theme/partials/member.sources.hbs b/docs-theme/partials/member.sources.hbs similarity index 100% rename from src/theme/partials/member.sources.hbs rename to docs-theme/partials/member.sources.hbs diff --git a/src/theme/partials/members.group.hbs b/docs-theme/partials/members.group.hbs similarity index 100% rename from src/theme/partials/members.group.hbs rename to docs-theme/partials/members.group.hbs diff --git a/src/theme/partials/members.hbs b/docs-theme/partials/members.hbs similarity index 100% rename from src/theme/partials/members.hbs rename to docs-theme/partials/members.hbs diff --git a/src/theme/partials/navigation.hbs b/docs-theme/partials/navigation.hbs similarity index 100% rename from src/theme/partials/navigation.hbs rename to docs-theme/partials/navigation.hbs diff --git a/src/theme/partials/parameter.hbs b/docs-theme/partials/parameter.hbs similarity index 100% rename from src/theme/partials/parameter.hbs rename to docs-theme/partials/parameter.hbs diff --git a/src/theme/partials/toc.hbs b/docs-theme/partials/toc.hbs similarity index 100% rename from src/theme/partials/toc.hbs rename to docs-theme/partials/toc.hbs diff --git a/src/theme/partials/toc.root.hbs b/docs-theme/partials/toc.root.hbs similarity index 100% rename from src/theme/partials/toc.root.hbs rename to docs-theme/partials/toc.root.hbs diff --git a/src/theme/partials/type.hbs b/docs-theme/partials/type.hbs similarity index 100% rename from src/theme/partials/type.hbs rename to docs-theme/partials/type.hbs diff --git a/src/theme/partials/typeAndParent.hbs b/docs-theme/partials/typeAndParent.hbs similarity index 100% rename from src/theme/partials/typeAndParent.hbs rename to docs-theme/partials/typeAndParent.hbs diff --git a/src/theme/partials/typeParameters.hbs b/docs-theme/partials/typeParameters.hbs similarity index 100% rename from src/theme/partials/typeParameters.hbs rename to docs-theme/partials/typeParameters.hbs diff --git a/src/theme/templates/index.hbs b/docs-theme/templates/index.hbs similarity index 100% rename from src/theme/templates/index.hbs rename to docs-theme/templates/index.hbs diff --git a/examples/daplink-flash/common.js b/examples/daplink-flash/common.js new file mode 100644 index 00000000..129a401e --- /dev/null +++ b/examples/daplink-flash/common.js @@ -0,0 +1,118 @@ +/* +* The MIT License (MIT) +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in all +* copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +*/ + +const fs = require("fs"); +const http = require("http"); +const https = require("https"); +const readline = require("readline"); +const progress = require("progress"); +const DAPjs = require("../../"); + +// Determine package URL or file path +function getFileName() { + return new Promise((resolve) => { + if (process.argv[2]) { + return resolve(process.argv[2]); + } + + let rl = readline.createInterface(process.stdin, process.stdout); + rl.question("Enter a URL or file path for the firmware package: ", answer => { + rl.close(); + resolve(answer); + }); + rl.write("binaries/k64f-green.bin"); + }); +} + +// Load a file +function loadFile(fileName, isJson=false) { + let file = fs.readFileSync(fileName); + return isJson ? JSON.parse(file) : new Uint8Array(file).buffer; +} + +// Download a file +function downloadFile(url, isJson=false) { + return new Promise((resolve, reject) => { + console.log("Downloading file..."); + let scheme = (url.indexOf("https") === 0) ? https : http; + + scheme.get(url, response => { + let data = []; + response.on("data", chunk => { + data.push(chunk); + }); + response.on("end", () => { + if (response.statusCode !== 200) return reject(response.statusMessage); + + let download = Buffer.concat(data); + if (isJson) { + resolve(JSON.parse(data)); + } + else { + resolve(new Uint8Array(download).buffer); + } + }); + }) + .on("error", error => { + reject(error); + }); + }); +} + +// Update device using image buffer +function flash(transport, program) { + console.log(`Using binary file ${program.byteLength} words long`); + const target = new DAPjs.DAPLink(transport); + + // Set up progressbar + const progressBar = new progress("Updating firmware [:bar] :percent :etas", { + complete: "=", + incomplete: " ", + width: 20, + total: program.byteLength + }); + + target.on(DAPjs.DAPLink.EVENT_PROGRESS, progress => { + progressBar.update(progress); + }); + + // Push binary to board + return target.connect() + .then(() => { + return target.flash(program); + }) + .then(() => { + return target.disconnect(); + }); +} + +module.exports = { + getFile: () => { + return getFileName() + .then(fileName => { + if (!fileName) throw new Error("No file name specified"); + if (fileName.indexOf("http") === 0) return downloadFile(fileName); + return loadFile(fileName); + }); + }, + flash: flash +}; diff --git a/examples/daplink-flash/hid.js b/examples/daplink-flash/hid.js new file mode 100644 index 00000000..39c4c2ba --- /dev/null +++ b/examples/daplink-flash/hid.js @@ -0,0 +1,73 @@ +/* +* The MIT License (MIT) +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in all +* copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +*/ + +const hid = require("node-hid"); +const common = require("./common"); +const DAPjs = require("../../"); + +// Allow user to select a device +function selectDevice(vendorID) { + return new Promise((resolve, reject) => { + let devices = hid.devices(); + devices = devices.filter(device => device.vendorId === vendorID); + + if (devices.length === 0) { + return reject("No devices found"); + } + + process.stdin.setRawMode(true); + process.stdin.setEncoding("utf8"); + process.stdin.on("readable", () => { + let input = process.stdin.read(); + if (input === "\u0003") { + process.exit(); + } else { + let index = parseInt(input); + if (index && index <= devices.length) { + process.stdin.setRawMode(false); + resolve(devices[index - 1]); + } + } + }); + + console.log("Select a device to flash:"); + devices.forEach((device, index) => { + console.log(`${index + 1}: ${device.product}`); + }); + }); +} + +common.getFile() +.then(program => { + return selectDevice(0xD28) + .then(device => { + const transport = new DAPjs.HID(device); + return common.flash(transport, program); + }); +}) +.then(() => { + process.exit(); +}) +.catch(error => { + console.error(error.message || error); + process.exit(); +}); diff --git a/examples/daplink-flash/usb.js b/examples/daplink-flash/usb.js new file mode 100644 index 00000000..adce7327 --- /dev/null +++ b/examples/daplink-flash/usb.js @@ -0,0 +1,91 @@ +/* +* The MIT License (MIT) +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in all +* copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +*/ + +const usb = require("usb"); +const common = require("./common"); +const DAPjs = require("../../"); + +function getStringDescriptor(device, index) { + return new Promise((resolve, reject) => { + try { + device.open(); + } catch (_e) { + resolve(""); + } + device.getStringDescriptor(index, (error, buffer) => { + device.close(); + if (error) return reject(error); + resolve(buffer.toString()); + }); + }); +} + +// Allow user to select a device +function selectDevice(vendorID) { + return new Promise((resolve, reject) => { + let devices = usb.getDeviceList(); + devices = devices.filter(device => device.deviceDescriptor.idVendor === vendorID); + + if (devices.length === 0) { + return reject("No devices found"); + } + + process.stdin.setRawMode(true); + process.stdin.setEncoding("utf8"); + process.stdin.on("readable", () => { + let input = process.stdin.read(); + if (input === "\u0003") { + process.exit(); + } else { + let index = parseInt(input); + if (index && index <= devices.length) { + process.stdin.setRawMode(false); + resolve(devices[index - 1]); + } + } + }); + + console.log("Select a device to flash:"); + devices.forEach((device, index) => { + getStringDescriptor(device, device.deviceDescriptor.iProduct) + .then(name => { + console.log(`${index + 1}: ${name}`); + }); + }); + }); +} + +common.getFile() +.then(program => { + return selectDevice(0xD28) + .then(device => { + const transport = new DAPjs.USB(device); + return common.flash(transport, program); + }); +}) +.then(() => { + process.exit(); +}) +.catch(error => { + console.error(error.message || error); + process.exit(); +}); diff --git a/examples/daplink-flash/web.html b/examples/daplink-flash/web.html new file mode 100644 index 00000000..03d0417a --- /dev/null +++ b/examples/daplink-flash/web.html @@ -0,0 +1,201 @@ + + + + + + DAPjs Demo + + + + + + + +

DAPjs WebUSB Flash

+
+ + + + + + + +
+ +
+ +
+
+
+
+
+ + + + + + + + + + + + diff --git a/examples/daplink-flash/webusb.js b/examples/daplink-flash/webusb.js new file mode 100644 index 00000000..b5ab6383 --- /dev/null +++ b/examples/daplink-flash/webusb.js @@ -0,0 +1,70 @@ +/* +* The MIT License (MIT) +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in all +* copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +*/ + +const USB = require("webusb").USB; +const common = require("./common"); +const DAPjs = require("../../"); + +// Allow user to select a device +function handleDevicesFound(devices, selectFn) { + process.stdin.setRawMode(true); + process.stdin.setEncoding("utf8"); + process.stdin.on("readable", () => { + let input = process.stdin.read(); + if (input === "\u0003") { + process.exit(); + } else { + let index = parseInt(input); + if (index && index <= devices.length) { + process.stdin.setRawMode(false); + selectFn(devices[index - 1]); + } + } + }); + + console.log("Select a device to flash:"); + devices.forEach((device, index) => { + console.log(`${index + 1}: ${device.productName || device.serialNumber}`); + }); +} + +let usb = new USB({ + devicesFound: handleDevicesFound +}); + +common.getFile() +.then(program => { + return usb.requestDevice({ + filters: [{vendorId: 0xD28}] + }) + .then(device => { + const transport = new DAPjs.WebUSB(device); + return common.flash(transport, program); + }); +}) +.then(() => { + process.exit(); +}) +.catch(error => { + console.error(error.message || error); + process.exit(); +}); diff --git a/examples/daplink-serial/common.js b/examples/daplink-serial/common.js new file mode 100644 index 00000000..1b78bc10 --- /dev/null +++ b/examples/daplink-serial/common.js @@ -0,0 +1,56 @@ +/* +* The MIT License (MIT) +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in all +* copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +*/ + +const DAPjs = require("../../"); + +// Listen to serial output from the device +function listen(transport) { + const target = new DAPjs.DAPLink(transport); + + target.on(DAPjs.DAPLink.EVENT_SERIAL_DATA, data => { + console.log(data); + }); + + return target.connect() + .then(() => { + return target.getSerialBaudrate(); + }) + .then(baud => { + target.startSerialRead(); + console.log(`Listening at ${baud} baud, press a key to stop...`); + + process.stdin.setRawMode(true); + process.stdin.on("data", () => { + process.stdin.setRawMode(false); + target.stopSerialRead() + + return target.disconnect() + .then(() => { + process.exit(); + }) + }); + }); +} + +module.exports = { + listen: listen +}; diff --git a/examples/daplink-serial/hid.js b/examples/daplink-serial/hid.js new file mode 100644 index 00000000..a09cd509 --- /dev/null +++ b/examples/daplink-serial/hid.js @@ -0,0 +1,67 @@ +/* +* The MIT License (MIT) +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in all +* copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +*/ + +const hid = require("node-hid"); +const common = require("./common"); +const DAPjs = require("../../"); + +// Allow user to select a device +function selectDevice(vendorID) { + return new Promise((resolve, reject) => { + let devices = hid.devices(); + devices = devices.filter(device => device.vendorId === vendorID); + + if (devices.length === 0) { + return reject("No devices found"); + } + + process.stdin.setRawMode(true); + process.stdin.setEncoding("utf8"); + process.stdin.on("readable", () => { + let input = process.stdin.read(); + if (input === "\u0003") { + process.exit(); + } else { + let index = parseInt(input); + if (index && index <= devices.length) { + process.stdin.setRawMode(false); + resolve(devices[index - 1]); + } + } + }); + + console.log("Select a device to listen to serial output:"); + devices.forEach((device, index) => { + console.log(`${index + 1}: ${device.product}`); + }); + }); +} + +selectDevice(0xD28) +.then(device => { + const transport = new DAPjs.HID(device); + return common.listen(transport); +}) +.catch(error => { + console.error(error.message || error); + process.exit(); +}); diff --git a/examples/daplink-serial/usb.js b/examples/daplink-serial/usb.js new file mode 100644 index 00000000..cf7e58c5 --- /dev/null +++ b/examples/daplink-serial/usb.js @@ -0,0 +1,85 @@ +/* +* The MIT License (MIT) +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in all +* copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +*/ + +const usb = require("usb"); +const common = require("./common"); +const DAPjs = require("../../"); + +function getStringDescriptor(device, index) { + return new Promise((resolve, reject) => { + try { + device.open(); + } catch (_e) { + resolve(""); + } + device.getStringDescriptor(index, (error, buffer) => { + device.close(); + if (error) return reject(error); + resolve(buffer.toString()); + }); + }); +} + +// Allow user to select a device +function selectDevice(vendorID) { + return new Promise((resolve, reject) => { + let devices = usb.getDeviceList(); + devices = devices.filter(device => device.deviceDescriptor.idVendor === vendorID); + + if (devices.length === 0) { + return reject("No devices found"); + } + + process.stdin.setRawMode(true); + process.stdin.setEncoding("utf8"); + process.stdin.on("readable", () => { + let input = process.stdin.read(); + if (input === "\u0003") { + process.exit(); + } else { + let index = parseInt(input); + if (index && index <= devices.length) { + process.stdin.setRawMode(false); + resolve(devices[index - 1]); + } + } + }); + + console.log("Select a device to listen to serial output:"); + devices.forEach((device, index) => { + getStringDescriptor(device, device.deviceDescriptor.iProduct) + .then(name => { + console.log(`${index + 1}: ${name}`); + }); + }); + }); +} + +selectDevice(0xD28) +.then(device => { + const transport = new DAPjs.USB(device); + return common.listen(transport); +}) +.catch(error => { + console.error(error.message || error); + process.exit(); +}); diff --git a/examples/daplink-serial/webusb.js b/examples/daplink-serial/webusb.js new file mode 100644 index 00000000..73c416e1 --- /dev/null +++ b/examples/daplink-serial/webusb.js @@ -0,0 +1,64 @@ +/* +* The MIT License (MIT) +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in all +* copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +*/ + +const USB = require("webusb").USB; +const common = require("./common"); +const DAPjs = require("../../"); + +// Allow user to select a device +function handleDevicesFound(devices, selectFn) { + process.stdin.setRawMode(true); + process.stdin.setEncoding("utf8"); + process.stdin.on("readable", () => { + let input = process.stdin.read(); + if (input === "\u0003") { + process.exit(); + } else { + let index = parseInt(input); + if (index && index <= devices.length) { + process.stdin.setRawMode(false); + selectFn(devices[index - 1]); + } + } + }); + + console.log("Select a device to listen to serial output:"); + devices.forEach((device, index) => { + console.log(`${index + 1}: ${device.productName || device.serialNumber}`); + }); +} + +let usb = new USB({ + devicesFound: handleDevicesFound +}); + +usb.requestDevice({ + filters: [{vendorId: 0xD28}] +}) +.then(device => { + const transport = new DAPjs.WebUSB(device); + return common.listen(transport); +}) +.catch(error => { + console.error(error.message || error); + process.exit(); +}); diff --git a/examples/flash.js b/examples/flash.js deleted file mode 100644 index b8bdb026..00000000 --- a/examples/flash.js +++ /dev/null @@ -1,199 +0,0 @@ -/* -* The MIT License (MIT) -* -* Permission is hereby granted, free of charge, to any person obtaining a copy -* of this software and associated documentation files (the "Software"), to deal -* in the Software without restriction, including without limitation the rights -* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -* copies of the Software, and to permit persons to whom the Software is -* furnished to do so, subject to the following conditions: -* -* The above copyright notice and this permission notice shall be included in all -* copies or substantial portions of the Software. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -* SOFTWARE. -*/ - -var fs = require("fs"); -var http = require("http"); -var https = require("https"); -var readline = require("readline"); -var progress = require("progress"); -var USB = require("webusb").USB; -var DAPjs = require("../"); - -process.stdin.setEncoding("utf8"); - -// Determine package URL or file path -function getFileName() { - return new Promise((resolve) => { - if (process.argv[2]) { - return resolve(process.argv[2]); - } - - var rl = readline.createInterface(process.stdin, process.stdout); - rl.question("Enter a URL or file path for the firmware package: ", answer => { - rl.close(); - resolve(answer); - }); - rl.write("binaries/k64f-blinky-green.bin"); - }); -} - -// Load a file -function loadFile(fileName, isJson=false) { - var file = fs.readFileSync(fileName); - return isJson ? JSON.parse(file) : new Uint8Array(file).buffer; -} - -// Download a file -function downloadFile(url, isJson=false) { - return new Promise((resolve, reject) => { - console.log("Downloading file..."); - var scheme = (url.indexOf("https") === 0) ? https : http; - - scheme.get(url, response => { - var data = []; - response.on("data", chunk => { - data.push(chunk); - }); - response.on("end", () => { - if (response.statusCode !== 200) return reject(response.statusMessage); - - var download = Buffer.concat(data); - if (isJson) { - resolve(JSON.parse(data)); - } - else { - resolve(new Uint8Array(download).buffer); - } - }); - }) - .on("error", error => { - reject(error); - }); - }); -} - -// Allow user to select a device -function handleDevicesFound(devices, selectFn) { - //return devices[0]; - process.stdin.setRawMode(true); - process.stdin.setEncoding("utf8"); - process.stdin.on("readable", () => { - var input = process.stdin.read(); - if (input === "\u0003") { - process.exit(); - } else { - var index = parseInt(input); - if (index && index <= devices.length) { - process.stdin.setRawMode(false); - selectFn(devices[index - 1]); - } - } - }); - - console.log("Select a device to flash:"); - devices.forEach((device, index) => { - console.log(`${index + 1}: ${device.productName || device.serialNumber}`); - }); -} - -// Connect to a device, halt it and return a target to use -function getTarget(device) { - var target = null; - var deviceCode = device.serialNumber.slice(0, 4); - var hid = new DAPjs.HID(device); - - // Open hid device - return hid.open() - .then(() => { - console.log("Device opened"); - // Load flashing algorithms - var flashAlgorithmsFile = "flash_targets/flash_targets.json"; - if (flashAlgorithmsFile.indexOf("http") === 0) return downloadFile(flashAlgorithmsFile, true); - return loadFile(flashAlgorithmsFile, true); - }) - .then((flashAlgorithms) => { - console.log("Flash algorithms loaded"); - var dapDevice = new DAPjs.DAP(hid); - var flashAlgorithm = new DAPjs.FlashAlgorithm(flashAlgorithms, deviceCode); - if (!flashAlgorithm.flashAlgo) throw new Error("Flash algorithm not found for this board."); - target = new DAPjs.FlashTarget(dapDevice, flashAlgorithm); - return target.init(); - }) - .then(() => { - console.log("Target initialised"); - return target.halt(); - }) - .then(() => { - console.log("Target halted"); - return target; - }) - .catch(error => { - console.log(error.message || error); - process.exit(); - }); -} - -// Update device using image buffer -function flash(target, buffer) { - - var progressBar = new progress("Updating firmware [:bar] :percent :etas", { - complete: "=", - incomplete: " ", - width: 20, - total: buffer.byteLength - }); - const program = DAPjs.FlashProgram.fromArrayBuffer(buffer); - - console.log(`Using binary file ${buffer.byteLength} words long`); - - // Push binary to board - return target.program(program, (progress) => { - progressBar.update(progress); - }) - .then(() => { - return target.reset(); - }) - .then(() => { - console.log("Target reset"); - // Make sure we don't have any issues flashing twice in the same session. - return target.flashUnInit(); - }); -} - -var usb = new USB({ - devicesFound: handleDevicesFound -}); - -getFileName() -.then(fileName => { - if (!fileName) throw new Error("No file name specified"); - if (fileName.indexOf("http") === 0) return downloadFile(fileName); - return loadFile(fileName); -}) -.then(buffer => { - return usb.requestDevice({ - filters: [{vendorId: 0x0d28}] - }) - .then(device => { - return getTarget(device); - }) - .then(target => { - return flash(target, buffer); - }); -}) -.then(() => { - process.exit(); -}) -.catch(error => { - console.log(error.message || error); - process.exit(); -}); diff --git a/examples/read-registers/common.js b/examples/read-registers/common.js new file mode 100644 index 00000000..b923a5ff --- /dev/null +++ b/examples/read-registers/common.js @@ -0,0 +1,53 @@ +/* +* The MIT License (MIT) +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in all +* copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +*/ + +const DAPjs = require("../../"); + +// Read device registers +function readRegisters(transport) { + const processor = new DAPjs.CortexM(transport); + + return processor.connect() + .then(() => { + return processor.halt(); + }) + .then(() => { + const registers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]; + return processor.readCoreRegisters(registers); + }) + .then(registers => { + registers.forEach((register, index) => { + console.log(`R${index}: ${("00000000" + register.toString(16)).slice(-8)}`); + }); + return processor.reconnect(); + }) + .then(() => { + return processor.resume(); + }) + .then(() => { + return processor.disconnect(); + }); +} + +module.exports = { + readRegisters: readRegisters +}; diff --git a/examples/read-registers/hid.js b/examples/read-registers/hid.js new file mode 100644 index 00000000..ca1dc96b --- /dev/null +++ b/examples/read-registers/hid.js @@ -0,0 +1,71 @@ +/* +* The MIT License (MIT) +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in all +* copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +*/ + +const hid = require("node-hid"); +const common = require("./common"); +const DAPjs = require("../../"); + +// Allow user to select a device +function selectDevice(vendorID) { + return new Promise((resolve, reject) => { + let devices = hid.devices(); + devices = devices.filter(device => device.vendorId === vendorID); + + if (devices.length === 0) { + return reject("No devices found"); + } + + process.stdin.setRawMode(true); + process.stdin.setEncoding("utf8"); + process.stdin.on("readable", () => { + let input = process.stdin.read(); + if (input === "\u0003") { + process.exit(); + } else { + let index = parseInt(input); + if (index && index <= devices.length) { + process.stdin.setRawMode(false); + resolve(devices[index - 1]); + } + } + }); + + console.log("Select a device to read registers:"); + devices.forEach((device, index) => { + console.log(`${index + 1}: ${device.product}`); + }); + }); +} + + +selectDevice(0xD28) +.then(device => { + const transport = new DAPjs.HID(device); + return common.readRegisters(transport); +}) +.then(() => { + process.exit(); +}) +.catch(error => { + console.error(error.message || error); + process.exit(); +}); diff --git a/examples/read-registers/usb.js b/examples/read-registers/usb.js new file mode 100644 index 00000000..f37a7440 --- /dev/null +++ b/examples/read-registers/usb.js @@ -0,0 +1,88 @@ +/* +* The MIT License (MIT) +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in all +* copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +*/ + +const usb = require("usb"); +const common = require("./common"); +const DAPjs = require("../../"); + +function getStringDescriptor(device, index) { + return new Promise((resolve, reject) => { + try { + device.open(); + } catch (_e) { + resolve(""); + } + device.getStringDescriptor(index, (error, buffer) => { + device.close(); + if (error) return reject(error); + resolve(buffer.toString()); + }); + }); +} + +// Allow user to select a device +function selectDevice(vendorID) { + return new Promise((resolve, reject) => { + let devices = usb.getDeviceList(); + devices = devices.filter(device => device.deviceDescriptor.idVendor === vendorID); + + if (devices.length === 0) { + return reject("No devices found"); + } + + process.stdin.setRawMode(true); + process.stdin.setEncoding("utf8"); + process.stdin.on("readable", () => { + let input = process.stdin.read(); + if (input === "\u0003") { + process.exit(); + } else { + let index = parseInt(input); + if (index && index <= devices.length) { + process.stdin.setRawMode(false); + resolve(devices[index - 1]); + } + } + }); + + console.log("Select a device to read registers:"); + devices.forEach((device, index) => { + getStringDescriptor(device, device.deviceDescriptor.iProduct) + .then(name => { + console.log(`${index + 1}: ${name}`); + }); + }); + }); +} + +selectDevice(0xD28) +.then(device => { + const transport = new DAPjs.USB(device); + return common.readRegisters(transport); +}) +.then(() => { + process.exit(); +}) +.catch(error => { + console.error(error.message || error); + process.exit(); +}); diff --git a/examples/read-registers/webusb.js b/examples/read-registers/webusb.js new file mode 100644 index 00000000..d5d9c0a7 --- /dev/null +++ b/examples/read-registers/webusb.js @@ -0,0 +1,67 @@ +/* +* The MIT License (MIT) +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in all +* copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +*/ + +const USB = require("webusb").USB; +const common = require("./common"); +const DAPjs = require("../../"); + +// Allow user to select a device +function handleDevicesFound(devices, selectFn) { + process.stdin.setRawMode(true); + process.stdin.setEncoding("utf8"); + process.stdin.on("readable", () => { + let input = process.stdin.read(); + if (input === "\u0003") { + process.exit(); + } else { + let index = parseInt(input); + if (index && index <= devices.length) { + process.stdin.setRawMode(false); + selectFn(devices[index - 1]); + } + } + }); + + console.log("Select a device to read registers:"); + devices.forEach((device, index) => { + console.log(`${index + 1}: ${device.productName || device.serialNumber}`); + }); +} + +let usb = new USB({ + devicesFound: handleDevicesFound +}); + +usb.requestDevice({ + filters: [{vendorId: 0xD28}] +}) +.then(device => { + const transport = new DAPjs.WebUSB(device); + return common.readRegisters(transport); +}) +.then(() => { + process.exit(); +}) +.catch(error => { + console.error(error.message || error); + process.exit(); +}); diff --git a/examples/web.html b/examples/web.html deleted file mode 100644 index 50ef1e2c..00000000 --- a/examples/web.html +++ /dev/null @@ -1,392 +0,0 @@ - - - - - WebUSB demo - - - - - - - - - - - - - -
- - -

DAP.js Demo

- -

- Flash and debug mbed enabled development boards in the browser - using CMSIS-DAP over WebUSB. Currently tested in Google Chrome - on Windows with an NXP Freedom K64F and the micro:bit. -

- -

- WebUSB is an experimental technology providing low-level USB - access from JavaScript code running in the browser. -

- -
-
-
    -
  1. -

    - Select a device: -

    -

    - -

    -
  2. -
  3. -

    - Choose platform: -

    -

    - -

    -

    - -

    -
  4. -
  5. -

    - Flash a binary: -

    -

    -

    - - -
    -

    - -
  6. - -
  7. -

    - Tools: -

    -

    -

    - - -
    -

    -

    - -

    -

    - -

    -
  8. -
  9. -

    - Serial monitor: -

    -

    - Baud Rate: - -

    - - -
    -

    -
  10. -
-
- -
- Output: -

-                    Serial monitor:
-                    

- -

-

-                
-
-
- - - - diff --git a/flash_targets/flash_targets.json b/flash_targets/flash_targets.json deleted file mode 100644 index e06132ad..00000000 --- a/flash_targets/flash_targets.json +++ /dev/null @@ -1,19587 +0,0 @@ -{ - "0200": { - "flash_algo": { - "analyzer_address": "0x1ffff000", - "analyzer_supported": true, - "begin_data": "0x20000800", - "begin_stack": "0x20000800", - "instructions": [ - "0xe00abe00", - "0x62d780d", - "0x24084068", - "0xd3000040", - "0x1e644058", - "0x1c49d1fa", - "0x2a001e52", - "0x4770d1f2", - "0x4604b570", - "0x4616460d", - "0x49302000", - "0x48306008", - "0xf0004448", - "0x2800f8e9", - "0x2001d001", - "0x2000bd70", - "0x4601e7fc", - "0x47702000", - "0x492ab510", - "0x44484828", - "0xf8c2f000", - "0x2c004604", - "0x2100d105", - "0x44484824", - "0xf9bef000", - "0xf0004604", - "0x4620f838", - "0xb570bd10", - "0x481f4604", - "0x4b1f4448", - "0x68c24621", - "0xf862f000", - "0x2d004605", - "0x481ad107", - "0x23004448", - "0x68c24621", - "0xf956f000", - "0xf0004605", - "0x4628f820", - "0xb5febd70", - "0x460c4605", - "0x46234616", - "0x46294632", - "0x44484810", - "0xf90af000", - "0x2f004607", - "0x2201d10b", - "0x46339001", - "0x90029200", - "0x46294622", - "0x44484809", - "0xf99af000", - "0xf0004607", - "0x4638f802", - "0x4807bdfe", - "0x210168c0", - "0x43880289", - "0x49041840", - "0x477060c8", - "0x40048100", - "0x4", - "0x6b65666b", - "0xf0003000", - "0x4a102070", - "0x20807010", - "0xbf007010", - "0x7800480d", - "0x280009c0", - "0x480bd0fa", - "0x20207801", - "0x28004008", - "0x2067d001", - "0x20104770", - "0x28004008", - "0x2068d001", - "0x7c8e7f8", - "0x28000fc0", - "0x2069d001", - "0x2000e7f2", - "0xe7f0", - "0x40020000", - "0xb081b5ff", - "0x460d4604", - "0xf0009804", - "0x4606f89f", - "0xd0022e00", - "0xb0054630", - "0x2304bdf0", - "0x46204629", - "0xf0009a03", - "0x4606f876", - "0xd0012e00", - "0xe7f24630", - "0x18289803", - "0x46381e47", - "0xf00068e1", - "0x2900f983", - "0x4638d009", - "0xf00068e1", - "0x1c40f97d", - "0x68e19000", - "0x43489800", - "0xe0131e47", - "0x4478480c", - "0x60056800", - "0x490b2009", - "0xf7ff71c8", - "0x4606ffa7", - "0x280069a0", - "0x69a0d001", - "0x2e004780", - "0xe003d000", - "0x194568e0", - "0xd9e942bd", - "0x4630bf00", - "0xe7c5", - "0x462", - "0x40020000", - "0x4604b570", - "0x4628460d", - "0xf856f000", - "0x2e004606", - "0x4630d001", - "0x2c00bd70", - "0x2004d101", - "0x2044e7fa", - "0x71c84902", - "0xff7ef7ff", - "0xe7f4", - "0x40020000", - "0x29004601", - "0x2004d101", - "0x482a4770", - "0x10068c0", - "0x400f00", - "0x447b4b28", - "0x3025a18", - "0xd1012a00", - "0xe7f12064", - "0x60082000", - "0x2001604a", - "0x2806088", - "0x200060c8", - "0x61486108", - "0xbf006188", - "0x4602e7e4", - "0xd1012a00", - "0x47702004", - "0x20006191", - "0xb530e7fb", - "0x2c004604", - "0x2004d101", - "0x1e58bd30", - "0x28004008", - "0x1e58d103", - "0x28004010", - "0x2065d001", - "0x6820e7f4", - "0xd8054288", - "0x68206865", - "0x188d1940", - "0xd20142a8", - "0xe7e92066", - "0xe7e72000", - "0x480c4601", - "0xd0014281", - "0x4770206b", - "0xe7fc2000", - "0x2b004603", - "0x2004d101", - "0x290f4770", - "0x2a04d801", - "0x2004d001", - "0x2000e7f8", - "0xe7f6", - "0x40048040", - "0x3c0", - "0x6b65666b", - "0xb081b5ff", - "0x46144607", - "0x2c00461d", - "0x2004d102", - "0xbdf0b005", - "0x462a2304", - "0x99024638", - "0xffb7f7ff", - "0x2e004606", - "0x4630d001", - "0xe01ce7f2", - "0x44794910", - "0x68099802", - "0xcc016008", - "0x4479490d", - "0x6809390c", - "0x20066048", - "0x71c8490b", - "0xfef4f7ff", - "0x69b84606", - "0xd0012800", - "0x478069b8", - "0xd0002e00", - "0x9802e005", - "0x90021d00", - "0x2d001f2d", - "0xbf00d1e0", - "0xe7cf4630", - "0x30a", - "0x40020000", - "0xb083b5ff", - "0x2304460c", - "0x9a054621", - "0xf7ff9803", - "0x9002ff82", - "0x28009802", - "0x9802d002", - "0xbdf0b007", - "0x68919a03", - "0xf0006850", - "0x4605f88f", - "0x42684261", - "0x424e4001", - "0xd10042a6", - "0x9f051976", - "0x1b30e027", - "0x98019001", - "0xd90042b8", - "0x98019701", - "0x90000880", - "0x44784811", - "0x60046800", - "0x49102001", - "0x980071c8", - "0xe010400", - "0x72c1480d", - "0x9800490c", - "0x98067288", - "0xf7ff7248", - "0x9002fea3", - "0x28009802", - "0x9802d001", - "0x9801e7cc", - "0x98011a3f", - "0x19761824", - "0x2f00bf00", - "0x2000d1d5", - "0xe7c2", - "0x26e", - "0x40020000", - "0x4604b570", - "0x2c00460d", - "0x2004d101", - "0x2040bd70", - "0x71c84903", - "0x71854608", - "0xfe80f7ff", - "0xe7f6", - "0x40020000", - "0xb081b5ff", - "0x4617460c", - "0x2d00461d", - "0x2004d102", - "0xbdf0b005", - "0x463a2304", - "0x98014621", - "0xff19f7ff", - "0x2e004606", - "0x4630d001", - "0xe022e7f2", - "0x44784813", - "0x60046800", - "0x49122002", - "0x980a71c8", - "0x490f72c8", - "0x39124479", - "0x68096828", - "0xf7ff6088", - "0x4606fe55", - "0xd00b2e00", - "0x2800980b", - "0x980bd001", - "0x980c6004", - "0xd0022800", - "0x980c2100", - "0xe0046001", - "0x1d2d1f3f", - "0x2f001d24", - "0xbf00d1da", - "0xe7c94630", - "0x1ce", - "0x40020000", - "0x9032200", - "0xd32c428b", - "0x428b0a03", - "0x2300d311", - "0xe04e469c", - "0x430b4603", - "0x2200d43c", - "0x428b0843", - "0x903d331", - "0xd31c428b", - "0x428b0a03", - "0x4694d301", - "0x9c3e03f", - "0xd301428b", - "0x1ac001cb", - "0x9834152", - "0xd301428b", - "0x1ac0018b", - "0x9434152", - "0xd301428b", - "0x1ac0014b", - "0x9034152", - "0xd301428b", - "0x1ac0010b", - "0x8c34152", - "0xd301428b", - "0x1ac000cb", - "0x8834152", - "0xd301428b", - "0x1ac0008b", - "0x8434152", - "0xd301428b", - "0x1ac0004b", - "0x1a414152", - "0x4601d200", - "0x46104152", - "0xe05d4770", - "0xd0000fca", - "0x10034249", - "0x4240d300", - "0x22004053", - "0x903469c", - "0xd32d428b", - "0x428b0a03", - "0x22fcd312", - "0xba120189", - "0x428b0a03", - "0x189d30c", - "0x428b1192", - "0x189d308", - "0x428b1192", - "0x189d304", - "0x1192d03a", - "0x989e000", - "0x428b09c3", - "0x1cbd301", - "0x41521ac0", - "0x428b0983", - "0x18bd301", - "0x41521ac0", - "0x428b0943", - "0x14bd301", - "0x41521ac0", - "0x428b0903", - "0x10bd301", - "0x41521ac0", - "0x428b08c3", - "0xcbd301", - "0x41521ac0", - "0x428b0883", - "0x8bd301", - "0x41521ac0", - "0x843d2d9", - "0xd301428b", - "0x1ac0004b", - "0x1a414152", - "0x4601d200", - "0x41524663", - "0x4610105b", - "0x4240d301", - "0xd5002b00", - "0x47704249", - "0x105b4663", - "0x4240d300", - "0x2000b501", - "0x46c046c0", - "0x2bd02", - "0x4", - "0x8", - "0x10", - "0x20", - "0x40", - "0x0", - "0x0", - "0x20", - "0x40020004", - "0x0" - ], - "load_address": "0x20000000", - "min_program_length": "0x4", - "page_buffers": [ - "0x20000800", - "0x20000c00" - ], - "pc_eraseAll": "0x20000049", - "pc_erase_sector": "0x2000006f", - "pc_init": "0x20000021", - "pc_program_page": "0x2000009f", - "static_base": "0x20000608" - }, - "memory_map": [ - { - "blocksize": "0x400", - "end": "0x1ffff", - "length": "0x20000", - "name": "flash", - "start": "0x0", - "type": "flash" - }, - { - "blocksize": "0x0", - "end": "0x20002fff", - "length": "0x4000", - "name": "ram", - "start": "0x1ffff000", - "type": "ram" - } - ], - "target_name": "kl25z" - }, - "0201": { - "flash_algo": { - "analyzer_address": "0x0", - "analyzer_supported": false, - "begin_data": "0x20000a00", - "begin_stack": "0x20000800", - "instructions": [ - "0xe00abe00", - "0x62d780d", - "0x24084068", - "0xd3000040", - "0x1e644058", - "0x1c49d1fa", - "0x2a001e52", - "0x4770d1f2", - "0x4937b510", - "0x60082000", - "0x78414836", - "0xf890649", - "0xd0152902", - "0x4a342100", - "0x444a2900", - "0xd0077011", - "0x229f7841", - "0x70414011", - "0x6497841", - "0xd1fb0f89", - "0x4448482e", - "0xf85ef000", - "0xd0002800", - "0xbd102001", - "0xe7e82101", - "0x44484828", - "0x28007800", - "0x4825d00a", - "0x229f7841", - "0x31404011", - "0x78417041", - "0xf890649", - "0xd1fa2902", - "0x47702000", - "0xb5104820", - "0x44484920", - "0xf88cf000", - "0xd1042800", - "0x2100481c", - "0xf0004448", - "0xbd10f946", - "0x4c19b570", - "0x444c4605", - "0x4b184601", - "0x68e24620", - "0xf8b3f000", - "0xd1052800", - "0x46292300", - "0x68e24620", - "0xf93df000", - "0xb570bd70", - "0x460b460c", - "0x46014606", - "0xb084480d", - "0x44484615", - "0xf8e2f000", - "0xd10a2800", - "0x90029001", - "0x48082101", - "0x462b9100", - "0x46314622", - "0xf0004448", - "0xb004f96b", - "0xbd70", - "0x40048100", - "0x4007e000", - "0x4", - "0x8", - "0x6b65666b", - "0xd00b2800", - "0x68c949db", - "0xf090109", - "0xd007290f", - "0x494ad9", - "0x5a51447a", - "0xe0030289", - "0x47702004", - "0x4c92101", - "0x2200b410", - "0x60416002", - "0x60812102", - "0x60c10289", - "0x7a0c49d1", - "0x40a3158b", - "0x7ac96143", - "0x62026102", - "0x61816242", - "0x2000bc10", - "0x28004770", - "0x6101d002", - "0x47702000", - "0x47702004", - "0x48c84602", - "0x210168c0", - "0x43080289", - "0x60c849c5", - "0x48c54770", - "0x70012170", - "0x70012180", - "0x6097801", - "0x7800d5fc", - "0xd5010681", - "0x47702067", - "0xd50106c1", - "0x47702068", - "0xd0fc07c0", - "0x47702069", - "0xd1012800", - "0x47702004", - "0x4604b510", - "0x48b84ab7", - "0x48b86050", - "0xd0014281", - "0xe000206b", - "0x28002000", - "0x4620d107", - "0xffd7f7ff", - "0x46204603", - "0xffcaf7ff", - "0xbd104618", - "0xd1012800", - "0x47702004", - "0x4614b510", - "0x60622200", - "0x60e260a2", - "0x61626122", - "0x61e261a2", - "0x68c16021", - "0x68816061", - "0xf0006840", - "0x60a0f951", - "0x20042108", - "0x60e06121", - "0x616161a0", - "0x200061e0", - "0xb5ffbd10", - "0x4615b089", - "0x466a460c", - "0xf7ff9809", - "0x462affd9", - "0x9b044621", - "0xf0009809", - "0x7f90c", - "0x9c00d130", - "0x19659e01", - "0x46311e6d", - "0xf0004628", - "0x2900f92f", - "0x1c40d002", - "0x1e454370", - "0xd81d42ac", - "0x20090221", - "0x6000a09", - "0x488c1809", - "0x498d6041", - "0x4288980c", - "0x206bd001", - "0x2000e000", - "0xd1112800", - "0xf7ff9809", - "0x4607ff80", - "0x69009809", - "0xd0002800", - "0x2f004780", - "0x19a4d102", - "0xd9e142ac", - "0xf7ff9809", - "0x4638ff69", - "0xbdf0b00d", - "0xd1012a00", - "0x47702004", - "0xb089b5ff", - "0x461e4614", - "0x466a460d", - "0xf7ff9809", - "0x4632ff91", - "0x9b034629", - "0xf0009809", - "0x7f8c4", - "0x9d00d12d", - "0xd0262e00", - "0x4870cc02", - "0x99036081", - "0xd0022904", - "0xd0072908", - "0x22ae00e", - "0xa122103", - "0x18510649", - "0xe0076041", - "0x60c1cc02", - "0x2107022a", - "0x6090a12", - "0x60411851", - "0xf7ff9809", - "0x4607ff3c", - "0x69009809", - "0xd0002800", - "0x2f004780", - "0x9803d103", - "0x1a361945", - "0x9809d1d8", - "0xff24f7ff", - "0xb00d4638", - "0x2800bdf0", - "0x4a5cd005", - "0x18890409", - "0x60514a57", - "0x2004e721", - "0xb5ff4770", - "0x4614b08b", - "0x460d461e", - "0x980b466a", - "0xff46f7ff", - "0x46294622", - "0x980b9b05", - "0xf879f000", - "0xd1332800", - "0x4629466a", - "0xf7ff980b", - "0x9d00ff39", - "0x90089802", - "0x42404269", - "0x424f4001", - "0xd10142af", - "0x183f9808", - "0xd0202c00", - "0x90090230", - "0x42a61b7e", - "0x4626d900", - "0x99054630", - "0xf888f000", - "0x2101022a", - "0x6090a12", - "0x493c1852", - "0x9a09604a", - "0x43100400", - "0x608830ff", - "0xf7ff980b", - "0x2800fee4", - "0x9808d106", - "0x19ad1ba4", - "0x2c00183f", - "0x2000d1e0", - "0xbdf0b00f", - "0xd1012b00", - "0x47702004", - "0xb089b5ff", - "0x461d4616", - "0x466a460c", - "0x98099f12", - "0xfefaf7ff", - "0x46214632", - "0x98099b07", - "0xf82df000", - "0xd11d2800", - "0x2e009c00", - "0x4929d01a", - "0x18470638", - "0x20010221", - "0x6400a09", - "0x48211809", - "0x60876041", - "0x60c16829", - "0xf7ff9809", - "0x2800feb0", - "0x9913d00a", - "0xd0002900", - "0x9914600c", - "0xd0012900", - "0x600a2200", - "0xbdf0b00d", - "0x1a769907", - "0x890889", - "0x9907194d", - "0x2e00190c", - "0xb00dd1dc", - "0x2800bdf0", - "0x2004d101", - "0xb4104770", - "0x42191e5b", - "0x421ad101", - "0xbc10d002", - "0x47702065", - "0x428b6803", - "0x6840d804", - "0x18181889", - "0xd2024288", - "0x2066bc10", - "0xbc104770", - "0x47702000", - "0x40048040", - "0x3b4", - "0x40020020", - "0xf0003000", - "0x40020000", - "0x44ffffff", - "0x6b65666b", - "0x4000ffff", - "0xffffff", - "0x460bb530", - "0x20004601", - "0x24012220", - "0x460de009", - "0x429d40d5", - "0x461dd305", - "0x1b494095", - "0x40954625", - "0x46151940", - "0x2d001e52", - "0xbd30dcf1", - "0x40020004", - "0x40020010", - "0x100008", - "0x200018", - "0x400030", - "0x800060", - "0x10000c0", - "0x2000180", - "0x4000300", - "0x600", - "0x0", - "0x0" - ], - "load_address": "0x20000000", - "page_size": "0x200", - "pc_eraseAll": "0x20000089", - "pc_erase_sector": "0x200000a5", - "pc_init": "0x20000021", - "pc_program_page": "0x200000cb", - "pc_unInit": "0x20000065", - "static_base": "0x20000500" - }, - "memory_map": [ - { - "blocksize": "0x400", - "end": "0x27fff", - "length": "0x28000", - "name": "flash", - "start": "0x0", - "type": "flash" - }, - { - "blocksize": "0x0", - "end": "0x20003fff", - "length": "0x5000", - "name": "ram", - "start": "0x1ffff000", - "type": "ram" - } - ], - "target_name": "kw41z4" - }, - "0202": { - "flash_algo": { - "analyzer_address": "0x0", - "analyzer_supported": false, - "begin_data": "0x20000a00", - "begin_stack": "0x20000800", - "instructions": [ - "0xe00abe00", - "0x62d780d", - "0x24084068", - "0xd3000040", - "0x1e644058", - "0x1c49d1fa", - "0x2a001e52", - "0x4770d1f2", - "0x4937b510", - "0x60082000", - "0x78414836", - "0xf890649", - "0xd0152902", - "0x4a342100", - "0x444a2900", - "0xd0077011", - "0x229f7841", - "0x70414011", - "0x6497841", - "0xd1fb0f89", - "0x4448482e", - "0xf85ef000", - "0xd0002800", - "0xbd102001", - "0xe7e82101", - "0x44484828", - "0x28007800", - "0x4825d00a", - "0x229f7841", - "0x31404011", - "0x78417041", - "0xf890649", - "0xd1fa2902", - "0x47702000", - "0xb5104820", - "0x44484920", - "0xf88cf000", - "0xd1042800", - "0x2100481c", - "0xf0004448", - "0xbd10f946", - "0x4c19b570", - "0x444c4605", - "0x4b184601", - "0x68e24620", - "0xf8b3f000", - "0xd1052800", - "0x46292300", - "0x68e24620", - "0xf93df000", - "0xb570bd70", - "0x460b460c", - "0x46014606", - "0xb084480d", - "0x44484615", - "0xf8e2f000", - "0xd10a2800", - "0x90029001", - "0x48082101", - "0x462b9100", - "0x46314622", - "0xf0004448", - "0xb004f96b", - "0xbd70", - "0x40048100", - "0x4007e000", - "0x4", - "0x8", - "0x6b65666b", - "0xd00b2800", - "0x68c949db", - "0xf090109", - "0xd007290f", - "0x494ad9", - "0x5a51447a", - "0xe0030289", - "0x47702004", - "0x4c92101", - "0x2200b410", - "0x60416002", - "0x60812102", - "0x60c10289", - "0x7a0c49d1", - "0x40a3158b", - "0x7ac96143", - "0x62026102", - "0x61816242", - "0x2000bc10", - "0x28004770", - "0x6101d002", - "0x47702000", - "0x47702004", - "0x48c84602", - "0x210168c0", - "0x43080289", - "0x60c849c5", - "0x48c54770", - "0x70012170", - "0x70012180", - "0x6097801", - "0x7800d5fc", - "0xd5010681", - "0x47702067", - "0xd50106c1", - "0x47702068", - "0xd0fc07c0", - "0x47702069", - "0xd1012800", - "0x47702004", - "0x4604b510", - "0x48b84ab7", - "0x48b86050", - "0xd0014281", - "0xe000206b", - "0x28002000", - "0x4620d107", - "0xffd7f7ff", - "0x46204603", - "0xffcaf7ff", - "0xbd104618", - "0xd1012800", - "0x47702004", - "0x4614b510", - "0x60622200", - "0x60e260a2", - "0x61626122", - "0x61e261a2", - "0x68c16021", - "0x68816061", - "0xf0006840", - "0x60a0f951", - "0x20042108", - "0x60e06121", - "0x616161a0", - "0x200061e0", - "0xb5ffbd10", - "0x4615b089", - "0x466a460c", - "0xf7ff9809", - "0x462affd9", - "0x9b044621", - "0xf0009809", - "0x7f90c", - "0x9c00d130", - "0x19659e01", - "0x46311e6d", - "0xf0004628", - "0x2900f92f", - "0x1c40d002", - "0x1e454370", - "0xd81d42ac", - "0x20090221", - "0x6000a09", - "0x488c1809", - "0x498d6041", - "0x4288980c", - "0x206bd001", - "0x2000e000", - "0xd1112800", - "0xf7ff9809", - "0x4607ff80", - "0x69009809", - "0xd0002800", - "0x2f004780", - "0x19a4d102", - "0xd9e142ac", - "0xf7ff9809", - "0x4638ff69", - "0xbdf0b00d", - "0xd1012a00", - "0x47702004", - "0xb089b5ff", - "0x461e4614", - "0x466a460d", - "0xf7ff9809", - "0x4632ff91", - "0x9b034629", - "0xf0009809", - "0x7f8c4", - "0x9d00d12d", - "0xd0262e00", - "0x4870cc02", - "0x99036081", - "0xd0022904", - "0xd0072908", - "0x22ae00e", - "0xa122103", - "0x18510649", - "0xe0076041", - "0x60c1cc02", - "0x2107022a", - "0x6090a12", - "0x60411851", - "0xf7ff9809", - "0x4607ff3c", - "0x69009809", - "0xd0002800", - "0x2f004780", - "0x9803d103", - "0x1a361945", - "0x9809d1d8", - "0xff24f7ff", - "0xb00d4638", - "0x2800bdf0", - "0x4a5cd005", - "0x18890409", - "0x60514a57", - "0x2004e721", - "0xb5ff4770", - "0x4614b08b", - "0x460d461e", - "0x980b466a", - "0xff46f7ff", - "0x46294622", - "0x980b9b05", - "0xf879f000", - "0xd1332800", - "0x4629466a", - "0xf7ff980b", - "0x9d00ff39", - "0x90089802", - "0x42404269", - "0x424f4001", - "0xd10142af", - "0x183f9808", - "0xd0202c00", - "0x90090230", - "0x42a61b7e", - "0x4626d900", - "0x99054630", - "0xf888f000", - "0x2101022a", - "0x6090a12", - "0x493c1852", - "0x9a09604a", - "0x43100400", - "0x608830ff", - "0xf7ff980b", - "0x2800fee4", - "0x9808d106", - "0x19ad1ba4", - "0x2c00183f", - "0x2000d1e0", - "0xbdf0b00f", - "0xd1012b00", - "0x47702004", - "0xb089b5ff", - "0x461d4616", - "0x466a460c", - "0x98099f12", - "0xfefaf7ff", - "0x46214632", - "0x98099b07", - "0xf82df000", - "0xd11d2800", - "0x2e009c00", - "0x4929d01a", - "0x18470638", - "0x20010221", - "0x6400a09", - "0x48211809", - "0x60876041", - "0x60c16829", - "0xf7ff9809", - "0x2800feb0", - "0x9913d00a", - "0xd0002900", - "0x9914600c", - "0xd0012900", - "0x600a2200", - "0xbdf0b00d", - "0x1a769907", - "0x890889", - "0x9907194d", - "0x2e00190c", - "0xb00dd1dc", - "0x2800bdf0", - "0x2004d101", - "0xb4104770", - "0x42191e5b", - "0x421ad101", - "0xbc10d002", - "0x47702065", - "0x428b6803", - "0x6840d804", - "0x18181889", - "0xd2024288", - "0x2066bc10", - "0xbc104770", - "0x47702000", - "0x40048040", - "0x3b4", - "0x40020020", - "0xf0003000", - "0x40020000", - "0x44ffffff", - "0x6b65666b", - "0x4000ffff", - "0xffffff", - "0x460bb530", - "0x20004601", - "0x24012220", - "0x460de009", - "0x429d40d5", - "0x461dd305", - "0x1b494095", - "0x40954625", - "0x46151940", - "0x2d001e52", - "0xbd30dcf1", - "0x40020004", - "0x40020010", - "0x100008", - "0x200018", - "0x400030", - "0x800060", - "0x10000c0", - "0x2000180", - "0x4000300", - "0x600", - "0x0", - "0x0" - ], - "load_address": "0x20000000", - "page_size": "0x200", - "pc_eraseAll": "0x20000089", - "pc_erase_sector": "0x200000a5", - "pc_init": "0x20000021", - "pc_program_page": "0x200000cb", - "pc_unInit": "0x20000065", - "static_base": "0x20000500" - }, - "memory_map": [ - { - "blocksize": "0x400", - "end": "0x27fff", - "length": "0x28000", - "name": "flash", - "start": "0x0", - "type": "flash" - }, - { - "blocksize": "0x0", - "end": "0x20003fff", - "length": "0x5000", - "name": "ram", - "start": "0x1ffff000", - "type": "ram" - } - ], - "target_name": "kw41z4" - }, - "0204": { - "flash_algo": { - "analyzer_supported": false, - "begin_data": "0x20000800", - "begin_stack": "0x20000800", - "instructions": [ - "0xe00abe00", - "0x62d780d", - "0x24084068", - "0xd3000040", - "0x1e644058", - "0x1c49d1fa", - "0x2a001e52", - "0x4770d1f2", - "0x4604b570", - "0x4616460d", - "0x49302000", - "0x48306008", - "0xf0004448", - "0x2800f8e9", - "0x2001d001", - "0x2000bd70", - "0x4601e7fc", - "0x47702000", - "0x492ab510", - "0x44484828", - "0xf8c2f000", - "0x2c004604", - "0x2100d105", - "0x44484824", - "0xf9bef000", - "0xf0004604", - "0x4620f838", - "0xb570bd10", - "0x481f4604", - "0x4b1f4448", - "0x68c24621", - "0xf862f000", - "0x2d004605", - "0x481ad107", - "0x23004448", - "0x68c24621", - "0xf956f000", - "0xf0004605", - "0x4628f820", - "0xb5febd70", - "0x460c4605", - "0x46234616", - "0x46294632", - "0x44484810", - "0xf90af000", - "0x2f004607", - "0x2201d10b", - "0x46339001", - "0x90029200", - "0x46294622", - "0x44484809", - "0xf99af000", - "0xf0004607", - "0x4638f802", - "0x4807bdfe", - "0x210168c0", - "0x43880289", - "0x49041840", - "0x477060c8", - "0x40048100", - "0x4", - "0x6b65666b", - "0xf0003000", - "0x4a102070", - "0x20807010", - "0xbf007010", - "0x7800480d", - "0x280009c0", - "0x480bd0fa", - "0x20207801", - "0x28004008", - "0x2067d001", - "0x20104770", - "0x28004008", - "0x2068d001", - "0x7c8e7f8", - "0x28000fc0", - "0x2069d001", - "0x2000e7f2", - "0xe7f0", - "0x40020000", - "0xb081b5ff", - "0x460d4604", - "0xf0009804", - "0x4606f89f", - "0xd0022e00", - "0xb0054630", - "0x2304bdf0", - "0x46204629", - "0xf0009a03", - "0x4606f876", - "0xd0012e00", - "0xe7f24630", - "0x18289803", - "0x46381e47", - "0xf00068e1", - "0x2900f983", - "0x4638d009", - "0xf00068e1", - "0x1c40f97d", - "0x68e19000", - "0x43489800", - "0xe0131e47", - "0x4478480c", - "0x60056800", - "0x490b2009", - "0xf7ff71c8", - "0x4606ffa7", - "0x280069a0", - "0x69a0d001", - "0x2e004780", - "0xe003d000", - "0x194568e0", - "0xd9e942bd", - "0x4630bf00", - "0xe7c5", - "0x462", - "0x40020000", - "0x4604b570", - "0x4628460d", - "0xf856f000", - "0x2e004606", - "0x4630d001", - "0x2c00bd70", - "0x2004d101", - "0x2044e7fa", - "0x71c84902", - "0xff7ef7ff", - "0xe7f4", - "0x40020000", - "0x29004601", - "0x2004d101", - "0x482a4770", - "0x10068c0", - "0x400f00", - "0x447b4b28", - "0x3025a18", - "0xd1012a00", - "0xe7f12064", - "0x60082000", - "0x2001604a", - "0x2806088", - "0x200060c8", - "0x61486108", - "0xbf006188", - "0x4602e7e4", - "0xd1012a00", - "0x47702004", - "0x20006191", - "0xb530e7fb", - "0x2c004604", - "0x2004d101", - "0x1e58bd30", - "0x28004008", - "0x1e58d103", - "0x28004010", - "0x2065d001", - "0x6820e7f4", - "0xd8054288", - "0x68206865", - "0x188d1940", - "0xd20142a8", - "0xe7e92066", - "0xe7e72000", - "0x480c4601", - "0xd0014281", - "0x4770206b", - "0xe7fc2000", - "0x2b004603", - "0x2004d101", - "0x290f4770", - "0x2a04d801", - "0x2004d001", - "0x2000e7f8", - "0xe7f6", - "0x40048040", - "0x3c0", - "0x6b65666b", - "0xb081b5ff", - "0x46144607", - "0x2c00461d", - "0x2004d102", - "0xbdf0b005", - "0x462a2304", - "0x99024638", - "0xffb7f7ff", - "0x2e004606", - "0x4630d001", - "0xe01ce7f2", - "0x44794910", - "0x68099802", - "0xcc016008", - "0x4479490d", - "0x6809390c", - "0x20066048", - "0x71c8490b", - "0xfef4f7ff", - "0x69b84606", - "0xd0012800", - "0x478069b8", - "0xd0002e00", - "0x9802e005", - "0x90021d00", - "0x2d001f2d", - "0xbf00d1e0", - "0xe7cf4630", - "0x30a", - "0x40020000", - "0xb083b5ff", - "0x2304460c", - "0x9a054621", - "0xf7ff9803", - "0x9002ff82", - "0x28009802", - "0x9802d002", - "0xbdf0b007", - "0x68919a03", - "0xf0006850", - "0x4605f88f", - "0x42684261", - "0x424e4001", - "0xd10042a6", - "0x9f051976", - "0x1b30e027", - "0x98019001", - "0xd90042b8", - "0x98019701", - "0x90000880", - "0x44784811", - "0x60046800", - "0x49102001", - "0x980071c8", - "0xe010400", - "0x72c1480d", - "0x9800490c", - "0x98067288", - "0xf7ff7248", - "0x9002fea3", - "0x28009802", - "0x9802d001", - "0x9801e7cc", - "0x98011a3f", - "0x19761824", - "0x2f00bf00", - "0x2000d1d5", - "0xe7c2", - "0x26e", - "0x40020000", - "0x4604b570", - "0x2c00460d", - "0x2004d101", - "0x2040bd70", - "0x71c84903", - "0x71854608", - "0xfe80f7ff", - "0xe7f6", - "0x40020000", - "0xb081b5ff", - "0x4617460c", - "0x2d00461d", - "0x2004d102", - "0xbdf0b005", - "0x463a2304", - "0x98014621", - "0xff19f7ff", - "0x2e004606", - "0x4630d001", - "0xe022e7f2", - "0x44784813", - "0x60046800", - "0x49122002", - "0x980a71c8", - "0x490f72c8", - "0x39124479", - "0x68096828", - "0xf7ff6088", - "0x4606fe55", - "0xd00b2e00", - "0x2800980b", - "0x980bd001", - "0x980c6004", - "0xd0022800", - "0x980c2100", - "0xe0046001", - "0x1d2d1f3f", - "0x2f001d24", - "0xbf00d1da", - "0xe7c94630", - "0x1ce", - "0x40020000", - "0x9032200", - "0xd32c428b", - "0x428b0a03", - "0x2300d311", - "0xe04e469c", - "0x430b4603", - "0x2200d43c", - "0x428b0843", - "0x903d331", - "0xd31c428b", - "0x428b0a03", - "0x4694d301", - "0x9c3e03f", - "0xd301428b", - "0x1ac001cb", - "0x9834152", - "0xd301428b", - "0x1ac0018b", - "0x9434152", - "0xd301428b", - "0x1ac0014b", - "0x9034152", - "0xd301428b", - "0x1ac0010b", - "0x8c34152", - "0xd301428b", - "0x1ac000cb", - "0x8834152", - "0xd301428b", - "0x1ac0008b", - "0x8434152", - "0xd301428b", - "0x1ac0004b", - "0x1a414152", - "0x4601d200", - "0x46104152", - "0xe05d4770", - "0xd0000fca", - "0x10034249", - "0x4240d300", - "0x22004053", - "0x903469c", - "0xd32d428b", - "0x428b0a03", - "0x22fcd312", - "0xba120189", - "0x428b0a03", - "0x189d30c", - "0x428b1192", - "0x189d308", - "0x428b1192", - "0x189d304", - "0x1192d03a", - "0x989e000", - "0x428b09c3", - "0x1cbd301", - "0x41521ac0", - "0x428b0983", - "0x18bd301", - "0x41521ac0", - "0x428b0943", - "0x14bd301", - "0x41521ac0", - "0x428b0903", - "0x10bd301", - "0x41521ac0", - "0x428b08c3", - "0xcbd301", - "0x41521ac0", - "0x428b0883", - "0x8bd301", - "0x41521ac0", - "0x843d2d9", - "0xd301428b", - "0x1ac0004b", - "0x1a414152", - "0x4601d200", - "0x41524663", - "0x4610105b", - "0x4240d301", - "0xd5002b00", - "0x47704249", - "0x105b4663", - "0x4240d300", - "0x2000b501", - "0x46c046c0", - "0x2bd02", - "0x4", - "0x8", - "0x10", - "0x20", - "0x40", - "0x0", - "0x0", - "0x20", - "0x40020004", - "0x0" - ], - "load_address": "0x20000000", - "min_program_length": "0x4", - "pc_eraseAll": "0x20000049", - "pc_erase_sector": "0x2000006f", - "pc_init": "0x20000021", - "pc_program_page": "0x2000009f", - "static_base": "0x20000608" - }, - "memory_map": [ - { - "blocksize": "0x400", - "end": "0x7fff", - "length": "0x8000", - "name": "flash", - "start": "0x0", - "type": "flash" - }, - { - "blocksize": "0x0", - "end": "0x20000bff", - "length": "0x1000", - "name": "ram", - "start": "0x1ffffc00", - "type": "ram" - } - ], - "target_name": "kl02z" - }, - "0206": { - "flash_algo": { - "analyzer_address": "0x1ffff000", - "analyzer_supported": true, - "begin_data": "0x20000a00", - "begin_stack": "0x20000800", - "instructions": [ - "0xe00abe00", - "0x62d780d", - "0x24084068", - "0xd3000040", - "0x1e644058", - "0x1c49d1fa", - "0x2a001e52", - "0x4770d1f2", - "0xb510482d", - "0x6041492b", - "0x71fff64f", - "0x68016081", - "0x180f021", - "0x120f041", - "0x48286001", - "0xf0004448", - "0x2800f851", - "0x2001bf18", - "0x2000bd10", - "0x48234770", - "0x4923b510", - "0xf0004448", - "0x2800f89d", - "0xbd10bf18", - "0x481e2100", - "0x4010e8bd", - "0xf0004448", - "0xb570b962", - "0x46054c1a", - "0x4601444c", - "0x46204b19", - "0xf00068e2", - "0x2800f8c2", - "0xbd70bf18", - "0x46292300", - "0xe8bd68e2", - "0x48124070", - "0xf0004448", - "0xb570b956", - "0x460b460c", - "0x46014606", - "0xb084480d", - "0x44484615", - "0xf8f5f000", - "0xbf1c2800", - "0xbd70b004", - "0x21012000", - "0x1000e9cd", - "0x48069002", - "0x4622462b", - "0x44484631", - "0xf989f000", - "0xbd70b004", - "0xd928c520", - "0x40052000", - "0x4", - "0x6b65666b", - "0xbf042800", - "0x47702004", - "0x6cc949f0", - "0x6103f3c1", - "0xbf08290f", - "0x2100f44f", - "0x4aedbf1f", - "0xf832447a", - "0x2891011", - "0x2200b410", - "0x2100e9c0", - "0x60812101", - "0x3094be8", - "0xf89360c1", - "0x110cc000", - "0xfc0cfa04", - "0xc014f8c0", - "0x618378db", - "0xf04f6102", - "0xe9c052a0", - "0xbc102108", - "0x47702000", - "0xbf0e2800", - "0x61012004", - "0x47702000", - "0x48dc4602", - "0x49db6800", - "0x20f040", - "0x46086008", - "0xf0406800", - "0x60080010", - "0x48d74770", - "0x70012170", - "0x70012180", - "0xf0117801", - "0xd0fb0f80", - "0xf0107800", - "0xbf1c0f20", - "0x47702067", - "0xf10f010", - "0x2068bf1c", - "0xf0104770", - "0xbf180001", - "0x47702069", - "0xbf042800", - "0x47702004", - "0x4604b510", - "0xf06f4ac7", - "0x6050403b", - "0x428148c6", - "0x206bbf14", - "0x28002000", - "0xbd10bf18", - "0xf7ff4620", - "0x4603ffd2", - "0xf7ff4620", - "0x4618ffc1", - "0x2800bd10", - "0x2004bf04", - "0x23004770", - "0x60936053", - "0x611360d3", - "0x61936153", - "0x601161d3", - "0x605168c1", - "0x1001e9d0", - "0xf0f0fbb1", - "0x20086090", - "0xe9c22110", - "0xe9c20103", - "0x20041005", - "0x200061d0", - "0xe92d4770", - "0xb0884df0", - "0x46984615", - "0x4682460c", - "0xf7ff466a", - "0x462affd8", - "0x46504621", - "0xf0009b04", - "0x7f92f", - "0xb008bf1c", - "0x8df0e8bd", - "0x4600e9dd", - "0x1e451960", - "0xf0f6fbb5", - "0x5110fb06", - "0x1c40b111", - "0x1e454370", - "0xbf9842ac", - "0xb270f8df", - "0xf024d81c", - "0xf040407f", - "0xf8cb6010", - "0x48990004", - "0xbf144580", - "0x2000206b", - "0xbf1c2800", - "0xe8bdb008", - "0x46508df0", - "0xff75f7ff", - "0xf8da4607", - "0x28000010", - "0x4780bf18", - "0x4434b917", - "0xd9e242ac", - "0xf7ff4650", - "0xb008ff5b", - "0xe8bd4638", - "0x2a008df0", - "0x2004bf04", - "0xe92d4770", - "0xb08945f0", - "0x461e4614", - "0x4680460d", - "0xf7ff466a", - "0x4632ff8a", - "0x46404629", - "0xf0009b03", - "0x7f8e1", - "0xb009bf1c", - "0x85f0e8bd", - "0x2e009d00", - "0xf8dfbf18", - "0xd025a1ec", - "0xb04f854", - "0x8f8ca", - "0x28049803", - "0xf025bf04", - "0xf040407f", - "0xd00960c0", - "0xd1092808", - "0xb04f854", - "0xcf8ca", - "0x407ff025", - "0x60e0f040", - "0x4f8ca", - "0xf7ff4640", - "0xf8d8ff2a", - "0x46071010", - "0xbf182900", - "0xb91f4788", - "0x44059803", - "0xd1d91a36", - "0xf7ff4640", - "0xb009ff0f", - "0xe8bd4638", - "0x280085f0", - "0x2004bf04", - "0x4a634770", - "0x4101ea42", - "0x60514a5f", - "0xe92de70d", - "0xb0884dff", - "0x469a4614", - "0x466a460d", - "0xf7ff9808", - "0x4622ff38", - "0x9b054629", - "0xf0009808", - "0x2800f88f", - "0xb00cbf1c", - "0x8df0e8bd", - "0x4629466a", - "0xf7ff9808", - "0x9e00ff28", - "0x8008f8dd", - "0xf1c84270", - "0x40080100", - "0x42b74247", - "0x4447bf08", - "0xbf182c00", - "0xb128f8df", - "0x1bbdd01f", - "0xbf8842a5", - "0x98054625", - "0x417ff026", - "0xf0f0fbb5", - "0x7180f041", - "0x1004f8cb", - "0xea400400", - "0xf040200a", - "0xf8cb00ff", - "0x98080008", - "0xfecdf7ff", - "0xbf1c2800", - "0xe8bdb00c", - "0x1b648df0", - "0x4447442e", - "0xb00cd1df", - "0xe8bd2000", - "0x2b008df0", - "0x2004bf04", - "0xe92d4770", - "0xb0884dff", - "0xe9dd4616", - "0x461d7a14", - "0x466a460c", - "0x8058f8dd", - "0xf7ff9808", - "0xe9ddfee2", - "0x46323007", - "0xf0004621", - "0x2800f839", - "0xb00cbf1c", - "0x8df0e8bd", - "0x2e009c00", - "0xb00cbf04", - "0x8df0e8bd", - "0xb094f8df", - "0x407ff06f", - "0x6707ea40", - "0x407ff024", - "0x7000f040", - "0x4f8cb", - "0x7008f8cb", - "0xf8cb6828", - "0x9808000c", - "0xfe89f7ff", - "0xf1bab168", - "0xbf180f00", - "0x4000f8ca", - "0xf00f1b8", - "0x2100bf1c", - "0x1000f8c8", - "0xe8bdb00c", - "0x99078df0", - "0xf0211a76", - "0x440d0103", - "0x440c9907", - "0xb00cd1da", - "0x8df0e8bd", - "0xbf042800", - "0x47702004", - "0x42191e5b", - "0x421abf0e", - "0x47702065", - "0x428b6803", - "0x6840d806", - "0x44184411", - "0xbf244288", - "0x47702000", - "0x47702066", - "0x40048000", - "0x3d0", - "0x40020028", - "0x40001400", - "0x40020000", - "0x6b65666b", - "0x4000ffff", - "0x40020004", - "0x40020010", - "0x100008", - "0x200018", - "0x400030", - "0x800060", - "0x10000c0", - "0x2000180", - "0x4000300", - "0x600", - "0x0" - ], - "load_address": "0x20000000", - "min_program_length": "0x8", - "page_buffers": [ - "0x20003000", - "0x20004000" - ], - "page_size": "0x1000", - "pc_eraseAll": "0x2000004f", - "pc_erase_sector": "0x2000006f", - "pc_init": "0x20000021", - "pc_program_page": "0x2000009b", - "pc_unInit": "0x2000004b", - "static_base": "0x200004f4" - }, - "memory_map": [ - { - "blocksize": "0x1000", - "end": "0x7ffff", - "length": "0x80000", - "name": "flash", - "start": "0x0", - "type": "flash" - }, - { - "blocksize": "0x0", - "end": "0x20007fff", - "length": "0x10000", - "name": "ram", - "start": "0x1fff8000", - "type": "ram" - } - ], - "target_name": "ke18f16" - }, - "0210": { - "flash_algo": { - "analyzer_supported": false, - "begin_data": "0x20000800", - "begin_stack": "0x20000800", - "instructions": [ - "0xe00abe00", - "0x62d780d", - "0x24084068", - "0xd3000040", - "0x1e644058", - "0x1c49d1fa", - "0x2a001e52", - "0x4770d1f2", - "0x4604b570", - "0x4616460d", - "0x49302000", - "0x48306008", - "0xf0004448", - "0x2800f8e9", - "0x2001d001", - "0x2000bd70", - "0x4601e7fc", - "0x47702000", - "0x492ab510", - "0x44484828", - "0xf8c2f000", - "0x2c004604", - "0x2100d105", - "0x44484824", - "0xf9bef000", - "0xf0004604", - "0x4620f838", - "0xb570bd10", - "0x481f4604", - "0x4b1f4448", - "0x68c24621", - "0xf862f000", - "0x2d004605", - "0x481ad107", - "0x23004448", - "0x68c24621", - "0xf956f000", - "0xf0004605", - "0x4628f820", - "0xb5febd70", - "0x460c4605", - "0x46234616", - "0x46294632", - "0x44484810", - "0xf90af000", - "0x2f004607", - "0x2201d10b", - "0x46339001", - "0x90029200", - "0x46294622", - "0x44484809", - "0xf99af000", - "0xf0004607", - "0x4638f802", - "0x4807bdfe", - "0x210168c0", - "0x43880289", - "0x49041840", - "0x477060c8", - "0x40048100", - "0x4", - "0x6b65666b", - "0xf0003000", - "0x4a102070", - "0x20807010", - "0xbf007010", - "0x7800480d", - "0x280009c0", - "0x480bd0fa", - "0x20207801", - "0x28004008", - "0x2067d001", - "0x20104770", - "0x28004008", - "0x2068d001", - "0x7c8e7f8", - "0x28000fc0", - "0x2069d001", - "0x2000e7f2", - "0xe7f0", - "0x40020000", - "0xb081b5ff", - "0x460d4604", - "0xf0009804", - "0x4606f89f", - "0xd0022e00", - "0xb0054630", - "0x2304bdf0", - "0x46204629", - "0xf0009a03", - "0x4606f876", - "0xd0012e00", - "0xe7f24630", - "0x18289803", - "0x46381e47", - "0xf00068e1", - "0x2900f983", - "0x4638d009", - "0xf00068e1", - "0x1c40f97d", - "0x68e19000", - "0x43489800", - "0xe0131e47", - "0x4478480c", - "0x60056800", - "0x490b2009", - "0xf7ff71c8", - "0x4606ffa7", - "0x280069a0", - "0x69a0d001", - "0x2e004780", - "0xe003d000", - "0x194568e0", - "0xd9e942bd", - "0x4630bf00", - "0xe7c5", - "0x462", - "0x40020000", - "0x4604b570", - "0x4628460d", - "0xf856f000", - "0x2e004606", - "0x4630d001", - "0x2c00bd70", - "0x2004d101", - "0x2044e7fa", - "0x71c84902", - "0xff7ef7ff", - "0xe7f4", - "0x40020000", - "0x29004601", - "0x2004d101", - "0x482a4770", - "0x10068c0", - "0x400f00", - "0x447b4b28", - "0x3025a18", - "0xd1012a00", - "0xe7f12064", - "0x60082000", - "0x2001604a", - "0x2806088", - "0x200060c8", - "0x61486108", - "0xbf006188", - "0x4602e7e4", - "0xd1012a00", - "0x47702004", - "0x20006191", - "0xb530e7fb", - "0x2c004604", - "0x2004d101", - "0x1e58bd30", - "0x28004008", - "0x1e58d103", - "0x28004010", - "0x2065d001", - "0x6820e7f4", - "0xd8054288", - "0x68206865", - "0x188d1940", - "0xd20142a8", - "0xe7e92066", - "0xe7e72000", - "0x480c4601", - "0xd0014281", - "0x4770206b", - "0xe7fc2000", - "0x2b004603", - "0x2004d101", - "0x290f4770", - "0x2a04d801", - "0x2004d001", - "0x2000e7f8", - "0xe7f6", - "0x40048040", - "0x3c0", - "0x6b65666b", - "0xb081b5ff", - "0x46144607", - "0x2c00461d", - "0x2004d102", - "0xbdf0b005", - "0x462a2304", - "0x99024638", - "0xffb7f7ff", - "0x2e004606", - "0x4630d001", - "0xe01ce7f2", - "0x44794910", - "0x68099802", - "0xcc016008", - "0x4479490d", - "0x6809390c", - "0x20066048", - "0x71c8490b", - "0xfef4f7ff", - "0x69b84606", - "0xd0012800", - "0x478069b8", - "0xd0002e00", - "0x9802e005", - "0x90021d00", - "0x2d001f2d", - "0xbf00d1e0", - "0xe7cf4630", - "0x30a", - "0x40020000", - "0xb083b5ff", - "0x2304460c", - "0x9a054621", - "0xf7ff9803", - "0x9002ff82", - "0x28009802", - "0x9802d002", - "0xbdf0b007", - "0x68919a03", - "0xf0006850", - "0x4605f88f", - "0x42684261", - "0x424e4001", - "0xd10042a6", - "0x9f051976", - "0x1b30e027", - "0x98019001", - "0xd90042b8", - "0x98019701", - "0x90000880", - "0x44784811", - "0x60046800", - "0x49102001", - "0x980071c8", - "0xe010400", - "0x72c1480d", - "0x9800490c", - "0x98067288", - "0xf7ff7248", - "0x9002fea3", - "0x28009802", - "0x9802d001", - "0x9801e7cc", - "0x98011a3f", - "0x19761824", - "0x2f00bf00", - "0x2000d1d5", - "0xe7c2", - "0x26e", - "0x40020000", - "0x4604b570", - "0x2c00460d", - "0x2004d101", - "0x2040bd70", - "0x71c84903", - "0x71854608", - "0xfe80f7ff", - "0xe7f6", - "0x40020000", - "0xb081b5ff", - "0x4617460c", - "0x2d00461d", - "0x2004d102", - "0xbdf0b005", - "0x463a2304", - "0x98014621", - "0xff19f7ff", - "0x2e004606", - "0x4630d001", - "0xe022e7f2", - "0x44784813", - "0x60046800", - "0x49122002", - "0x980a71c8", - "0x490f72c8", - "0x39124479", - "0x68096828", - "0xf7ff6088", - "0x4606fe55", - "0xd00b2e00", - "0x2800980b", - "0x980bd001", - "0x980c6004", - "0xd0022800", - "0x980c2100", - "0xe0046001", - "0x1d2d1f3f", - "0x2f001d24", - "0xbf00d1da", - "0xe7c94630", - "0x1ce", - "0x40020000", - "0x9032200", - "0xd32c428b", - "0x428b0a03", - "0x2300d311", - "0xe04e469c", - "0x430b4603", - "0x2200d43c", - "0x428b0843", - "0x903d331", - "0xd31c428b", - "0x428b0a03", - "0x4694d301", - "0x9c3e03f", - "0xd301428b", - "0x1ac001cb", - "0x9834152", - "0xd301428b", - "0x1ac0018b", - "0x9434152", - "0xd301428b", - "0x1ac0014b", - "0x9034152", - "0xd301428b", - "0x1ac0010b", - "0x8c34152", - "0xd301428b", - "0x1ac000cb", - "0x8834152", - "0xd301428b", - "0x1ac0008b", - "0x8434152", - "0xd301428b", - "0x1ac0004b", - "0x1a414152", - "0x4601d200", - "0x46104152", - "0xe05d4770", - "0xd0000fca", - "0x10034249", - "0x4240d300", - "0x22004053", - "0x903469c", - "0xd32d428b", - "0x428b0a03", - "0x22fcd312", - "0xba120189", - "0x428b0a03", - "0x189d30c", - "0x428b1192", - "0x189d308", - "0x428b1192", - "0x189d304", - "0x1192d03a", - "0x989e000", - "0x428b09c3", - "0x1cbd301", - "0x41521ac0", - "0x428b0983", - "0x18bd301", - "0x41521ac0", - "0x428b0943", - "0x14bd301", - "0x41521ac0", - "0x428b0903", - "0x10bd301", - "0x41521ac0", - "0x428b08c3", - "0xcbd301", - "0x41521ac0", - "0x428b0883", - "0x8bd301", - "0x41521ac0", - "0x843d2d9", - "0xd301428b", - "0x1ac0004b", - "0x1a414152", - "0x4601d200", - "0x41524663", - "0x4610105b", - "0x4240d301", - "0xd5002b00", - "0x47704249", - "0x105b4663", - "0x4240d300", - "0x2000b501", - "0x46c046c0", - "0x2bd02", - "0x4", - "0x8", - "0x10", - "0x20", - "0x40", - "0x0", - "0x0", - "0x20", - "0x40020004", - "0x0" - ], - "load_address": "0x20000000", - "min_program_length": "0x4", - "pc_eraseAll": "0x20000049", - "pc_erase_sector": "0x2000006f", - "pc_init": "0x20000021", - "pc_program_page": "0x2000009f", - "static_base": "0x20000608" - }, - "memory_map": [ - { - "blocksize": "0x400", - "end": "0x7fff", - "length": "0x8000", - "name": "flash", - "start": "0x0", - "type": "flash" - }, - { - "blocksize": "0x0", - "end": "0x20000bff", - "length": "0x1000", - "name": "ram", - "start": "0x1ffffc00", - "type": "ram" - } - ], - "target_name": "kl05z" - }, - "0213": { - "flash_algo": { - "analyzer_address": "0x1ffff000", - "analyzer_supported": true, - "begin_data": "0x20000a00", - "begin_stack": "0x20000800", - "instructions": [ - "0xe00abe00", - "0x62d780d", - "0x24084068", - "0xd3000040", - "0x1e644058", - "0x1c49d1fa", - "0x2a001e52", - "0x4770d1f2", - "0x4829b510", - "0x60414927", - "0x60814928", - "0x22806801", - "0x22204391", - "0x60014311", - "0x44484825", - "0xf84cf000", - "0xd0002800", - "0xbd102001", - "0x47702000", - "0xb5104820", - "0x44484920", - "0xf88ef000", - "0xd1042800", - "0x2100481c", - "0xf0004448", - "0xbd10f948", - "0x4c19b570", - "0x444c4605", - "0x4b184601", - "0x68e24620", - "0xf8b5f000", - "0xd1052800", - "0x46292300", - "0x68e24620", - "0xf93ff000", - "0xb570bd70", - "0x460b460c", - "0x46014606", - "0xb084480d", - "0x44484615", - "0xf8e4f000", - "0xd10a2800", - "0x90029001", - "0x48082101", - "0x462b9100", - "0x46314622", - "0xf0004448", - "0xb004f96d", - "0xbd70", - "0xd928c520", - "0x40052000", - "0xffff", - "0x4", - "0x6b65666b", - "0xd00b2800", - "0x68c949dd", - "0xf090109", - "0xd007290f", - "0x494adb", - "0x5a51447a", - "0xe0030289", - "0x47702004", - "0x4892101", - "0x2300b430", - "0x60416003", - "0x2cc2101", - "0x608160c4", - "0x7a0d49d3", - "0x40aa158a", - "0x7ac96142", - "0x61816103", - "0x6892105", - "0x62016244", - "0x2000bc30", - "0x28004770", - "0x6101d002", - "0x47702000", - "0x47702004", - "0x48c94602", - "0x210168c0", - "0x43080289", - "0x60c849c6", - "0x48c64770", - "0x70012170", - "0x70012180", - "0x6097801", - "0x7800d5fc", - "0xd5010681", - "0x47702067", - "0xd50106c1", - "0x47702068", - "0xd0fc07c0", - "0x47702069", - "0xd1012800", - "0x47702004", - "0x4604b510", - "0x48b94ab8", - "0x48b96050", - "0xd0014281", - "0xe000206b", - "0x28002000", - "0x4620d107", - "0xffd7f7ff", - "0x46204603", - "0xffcaf7ff", - "0xbd104618", - "0xd1012800", - "0x47702004", - "0x4614b510", - "0x60622200", - "0x60e260a2", - "0x61626122", - "0x61e261a2", - "0x68c16021", - "0x68816061", - "0xf0006840", - "0x60a0f953", - "0x60e02008", - "0x61606120", - "0x200461a0", - "0x200061e0", - "0xb5ffbd10", - "0x4615b089", - "0x466a460c", - "0xf7ff9809", - "0x462affd9", - "0x9b044621", - "0xf0009809", - "0x7f90c", - "0x9c00d130", - "0x19659e01", - "0x46311e6d", - "0xf0004628", - "0x2900f931", - "0x1c40d002", - "0x1e454370", - "0xd81d42ac", - "0x20090221", - "0x6000a09", - "0x488d1809", - "0x498e6041", - "0x4288980c", - "0x206bd001", - "0x2000e000", - "0xd1112800", - "0xf7ff9809", - "0x4607ff80", - "0x69009809", - "0xd0002800", - "0x2f004780", - "0x19a4d102", - "0xd9e142ac", - "0xf7ff9809", - "0x4638ff69", - "0xbdf0b00d", - "0xd1012a00", - "0x47702004", - "0xb089b5ff", - "0x461e4614", - "0x466a460d", - "0xf7ff9809", - "0x4632ff91", - "0x9b034629", - "0xf0009809", - "0x7f8c4", - "0x9d00d12d", - "0xd0262e00", - "0x4871cc02", - "0x99036081", - "0xd0022904", - "0xd0072908", - "0x22ae00e", - "0xa122103", - "0x18510649", - "0xe0076041", - "0x60c1cc02", - "0x2107022a", - "0x6090a12", - "0x60411851", - "0xf7ff9809", - "0x4607ff3c", - "0x69009809", - "0xd0002800", - "0x2f004780", - "0x9803d103", - "0x1a361945", - "0x9809d1d8", - "0xff24f7ff", - "0xb00d4638", - "0x2800bdf0", - "0x4a5dd005", - "0x18890409", - "0x60514a58", - "0x2004e721", - "0xb5ff4770", - "0x4614b08b", - "0x460d461e", - "0x980b466a", - "0xff46f7ff", - "0x46294622", - "0x980b9b05", - "0xf879f000", - "0xd1332800", - "0x4629466a", - "0xf7ff980b", - "0x9d00ff39", - "0x90089802", - "0x42404269", - "0x424f4001", - "0xd10142af", - "0x183f9808", - "0xd0202c00", - "0x90090230", - "0x42a61b7e", - "0x4626d900", - "0x99054630", - "0xf88af000", - "0x2101022a", - "0x6090a12", - "0x493d1852", - "0x9a09604a", - "0x43100400", - "0x608830ff", - "0xf7ff980b", - "0x2800fee4", - "0x9808d106", - "0x19ad1ba4", - "0x2c00183f", - "0x2000d1e0", - "0xbdf0b00f", - "0xd1012b00", - "0x47702004", - "0xb089b5ff", - "0x461d4616", - "0x466a460c", - "0x98099f12", - "0xfefaf7ff", - "0x46214632", - "0x98099b07", - "0xf82df000", - "0xd11d2800", - "0x2e009c00", - "0x492ad01a", - "0x18470638", - "0x20010221", - "0x6400a09", - "0x48221809", - "0x60876041", - "0x60c16829", - "0xf7ff9809", - "0x2800feb0", - "0x9913d00a", - "0xd0002900", - "0x9914600c", - "0xd0012900", - "0x600a2200", - "0xbdf0b00d", - "0x1a769907", - "0x890889", - "0x9907194d", - "0x2e00190c", - "0xb00dd1dc", - "0x2800bdf0", - "0x2004d101", - "0xb4104770", - "0x460c1e5b", - "0xd101421c", - "0xd002421a", - "0x2065bc10", - "0x68034770", - "0xd804428b", - "0x18896840", - "0x42881818", - "0xbc10d202", - "0x47702066", - "0x2000bc10", - "0x4770", - "0x40048040", - "0x3bc", - "0x40020020", - "0xf0003000", - "0x40020000", - "0x44ffffff", - "0x6b65666b", - "0x4000ffff", - "0xffffff", - "0x460bb530", - "0x20004601", - "0x24012220", - "0x460de009", - "0x429d40d5", - "0x461dd305", - "0x1b494095", - "0x40954625", - "0x46151940", - "0x2d001e52", - "0xbd30dcf1", - "0x40020004", - "0x40020010", - "0x100008", - "0x200018", - "0x400030", - "0x800060", - "0x10000c0", - "0x2000180", - "0x4000300", - "0x600", - "0x0" - ], - "load_address": "0x20000000", - "min_program_length": "0x8", - "page_buffers": [ - "0x20003000", - "0x20004000" - ], - "page_size": "0x800", - "pc_eraseAll": "0x2000004d", - "pc_erase_sector": "0x20000069", - "pc_init": "0x20000021", - "pc_program_page": "0x2000008f", - "pc_unInit": "0x20000049", - "static_base": "0x200004cc" - }, - "memory_map": [ - { - "blocksize": "0x800", - "end": "0x3ffff", - "length": "0x40000", - "name": "flash", - "start": "0x0", - "type": "flash" - }, - { - "blocksize": "0x0", - "end": "0x20005fff", - "length": "0x8000", - "name": "ram", - "start": "0x1fffe000", - "type": "ram" - } - ], - "target_name": "ke15z7" - }, - "0214": { - "flash_algo": { - "analyzer_address": "0x1ffff000", - "analyzer_supported": true, - "begin_data": "0x20003000", - "begin_stack": "0x20001000", - "instructions": [ - "0xe00abe00", - "0x62d780d", - "0x24084068", - "0xd3000040", - "0x1e644058", - "0x1c49d1fa", - "0x2a001e52", - "0x4770d1f2", - "0x4604b570", - "0x4616460d", - "0x5020f24c", - "0x81c84932", - "0x1028f64d", - "0x460881c8", - "0xf0208800", - "0x80080001", - "0x4448482e", - "0xf8dcf000", - "0x2001b108", - "0x2000bd70", - "0x4601e7fc", - "0x47702000", - "0x4929b510", - "0x44484827", - "0xf8b8f000", - "0xb92c4604", - "0x48242100", - "0xf0004448", - "0x4604f9a9", - "0xf837f000", - "0xbd104620", - "0x4604b570", - "0x4448481e", - "0x46214b1e", - "0xf00068c2", - "0x4605f85d", - "0x481ab93d", - "0x23004448", - "0x68c24621", - "0xf946f000", - "0xf0004605", - "0x4628f820", - "0xb5febd70", - "0x460c4605", - "0x46234616", - "0x46294632", - "0x44484810", - "0xf8f8f000", - "0xb9674607", - "0x22012000", - "0x2000e9cd", - "0x46224633", - "0x90024629", - "0x44484809", - "0xf984f000", - "0xf0004607", - "0x4638f802", - "0x4807bdfe", - "0xf4206840", - "0xf5000070", - "0x49040070", - "0x47706048", - "0x40052000", - "0x4", - "0x6b65666b", - "0x4001f000", - "0x4a0e2070", - "0x20807010", - "0xbf007010", - "0x7800480b", - "0x280009c0", - "0x4809d0fa", - "0xf0017801", - "0xb1080020", - "0x47702067", - "0x10f001", - "0x2068b108", - "0xf001e7f9", - "0xb1080001", - "0xe7f42069", - "0xe7f22000", - "0x40020000", - "0x4df0e92d", - "0x460d4604", - "0x469a4690", - "0xf0004650", - "0x4606f891", - "0x4630b116", - "0x8df0e8bd", - "0x46422310", - "0x46204629", - "0xf86cf000", - "0xb10e4606", - "0xe7f34630", - "0x8eb05", - "0x68e01e47", - "0xf1f0fbb7", - "0x7011fb00", - "0x68e0b140", - "0xf0f0fbb7", - "0xb01f100", - "0xfb0068e0", - "0x1e47f00b", - "0x480be011", - "0x68004478", - "0x20096005", - "0x71c84909", - "0xffacf7ff", - "0x69a04606", - "0x69a0b108", - "0xb1064780", - "0x68e0e003", - "0x42bd4405", - "0xbf00d9eb", - "0xe7c94630", - "0x2ec", - "0x40020000", - "0x4604b570", - "0x4628460d", - "0xf84ef000", - "0xb10e4606", - "0xbd704630", - "0x2004b90c", - "0x2044e7fb", - "0x71c84902", - "0xff88f7ff", - "0xe7f5", - "0x40020000", - "0xb9094601", - "0x47702004", - "0x6cc04826", - "0x6003f3c0", - "0x447b4b25", - "0x10f833", - "0xb90a0302", - "0xe7f22064", - "0x60082000", - "0x2002604a", - "0x2c06088", - "0x200060c8", - "0x61486108", - "0xbf006188", - "0x4602e7e5", - "0x2004b90a", - "0x61914770", - "0xe7fb2000", - "0x4604b530", - "0x2004b90c", - "0x1e58bd30", - "0xb9104008", - "0x40101e58", - "0x2065b108", - "0x6820e7f6", - "0xd8054288", - "0x500e9d4", - "0x188d4428", - "0xd20142a8", - "0xe7eb2066", - "0xe7e92000", - "0x480b4601", - "0xd0014281", - "0x4770206b", - "0xe7fc2000", - "0xb90b4603", - "0x47702004", - "0xd801290f", - "0xd0012a04", - "0xe7f82004", - "0xe7f62000", - "0x40048000", - "0x25a", - "0x6b65666b", - "0x41f0e92d", - "0x46884607", - "0x461d4614", - "0x2004b914", - "0x81f0e8bd", - "0x462a2308", - "0x46384641", - "0xffbcf7ff", - "0xb10e4606", - "0xe7f34630", - "0x4812e01f", - "0x68004478", - "0x8000f8c0", - "0x490fcc01", - "0x390c4479", - "0x60486809", - "0x490ccc01", - "0x39184479", - "0x60886809", - "0x490a2007", - "0xf7ff71c8", - "0x4606ff01", - "0xb10869b8", - "0x478069b8", - "0xe004b106", - "0x808f108", - "0x2d003d08", - "0xbf00d1dd", - "0xe7cd4630", - "0x1b0", - "0x40020000", - "0x4dffe92d", - "0x4682b082", - "0x2310460c", - "0x46504621", - "0xf7ff9a04", - "0x4683ff83", - "0xf00f1bb", - "0x4658d003", - "0xe8bdb006", - "0xe9da8df0", - "0xfbb00101", - "0x4260f7f1", - "0x40084279", - "0x42a54245", - "0x443dd100", - "0xe0229e04", - "0x804eba5", - "0xd90045b0", - "0xea4f46b0", - "0x90011018", - "0x4478480f", - "0x60046800", - "0x490e2001", - "0x980171c8", - "0x72c80a00", - "0x72889801", - "0x72489805", - "0xfeb6f7ff", - "0xf1bb4683", - "0xd0010f00", - "0xe7d14658", - "0x608eba6", - "0x443d4444", - "0x2e00bf00", - "0x2000d1da", - "0xe7c8", - "0x10e", - "0x40020000", - "0x4604b570", - "0xb90c460d", - "0xbd702004", - "0x49032040", - "0x460871c8", - "0xf7ff7185", - "0xe7f6fe95", - "0x40020000", - "0x4dffe92d", - "0x4617460c", - "0xe9dd461d", - "0xf8ddb80c", - "0xb91da038", - "0xb0042004", - "0x8df0e8bd", - "0x463a2304", - "0x98004621", - "0xff1ef7ff", - "0xb10e4606", - "0xe7f24630", - "0x4814e022", - "0x68004478", - "0x20026004", - "0x71c84912", - "0xf8804608", - "0x490fb00b", - "0x39144479", - "0x68096828", - "0xf7ff6088", - "0x4606fe67", - "0xf1b8b15e", - "0xd0010f00", - "0x4000f8c8", - "0xf00f1ba", - "0x2000d002", - "0xf8ca", - "0x1f3fe004", - "0x1d241d2d", - "0xd1da2f00", - "0x4630bf00", - "0xe7c9", - "0x74", - "0x40020000", - "0x0", - "0x80000", - "0x100000", - "0x200000", - "0x400000", - "0x800000", - "0x1000000", - "0x1000000", - "0x40020004", - "0x0" - ], - "load_address": "0x20000000", - "min_program_length": "0x8", - "page_buffers": [ - "0x20003000", - "0x20004000" - ], - "pc_eraseAll": "0x20000059", - "pc_erase_sector": "0x2000007d", - "pc_init": "0x20000021", - "pc_program_page": "0x200000ab", - "static_base": "0x20000494" - }, - "memory_map": [ - { - "blocksize": "0x1000", - "end": "0xfffff", - "length": "0x100000", - "name": "flash", - "start": "0x0", - "type": "flash" - }, - { - "blocksize": "0x0", - "end": "0x2002ffff", - "length": "0x40000", - "name": "ram", - "start": "0x1fff0000", - "type": "ram" - } - ], - "target_name": "k64f" - }, - "0216": { - "flash_algo": { - "analyzer_address": "0x1ffff000", - "analyzer_supported": true, - "begin_data": "0x20000a00", - "begin_stack": "0x20000800", - "instructions": [ - "0xe00abe00", - "0x62d780d", - "0x24084068", - "0xd3000040", - "0x1e644058", - "0x1c49d1fa", - "0x2a001e52", - "0x4770d1f2", - "0xb510482d", - "0x6041492b", - "0x71fff64f", - "0x68016081", - "0x180f021", - "0x120f041", - "0x48286001", - "0xf0004448", - "0x2800f851", - "0x2001bf18", - "0x2000bd10", - "0x48234770", - "0x4923b510", - "0xf0004448", - "0x2800f89d", - "0xbd10bf18", - "0x481e2100", - "0x4010e8bd", - "0xf0004448", - "0xb570b962", - "0x46054c1a", - "0x4601444c", - "0x46204b19", - "0xf00068e2", - "0x2800f8c2", - "0xbd70bf18", - "0x46292300", - "0xe8bd68e2", - "0x48124070", - "0xf0004448", - "0xb570b956", - "0x460b460c", - "0x46014606", - "0xb084480d", - "0x44484615", - "0xf8f5f000", - "0xbf1c2800", - "0xbd70b004", - "0x21012000", - "0x1000e9cd", - "0x48069002", - "0x4622462b", - "0x44484631", - "0xf989f000", - "0xbd70b004", - "0xd928c520", - "0x40052000", - "0x4", - "0x6b65666b", - "0xbf042800", - "0x47702004", - "0x6cc949f0", - "0x6103f3c1", - "0xbf08290f", - "0x2100f44f", - "0x4aedbf1f", - "0xf832447a", - "0x2891011", - "0x2200b410", - "0x2100e9c0", - "0x60812101", - "0x3094be8", - "0xf89360c1", - "0x110cc000", - "0xfc0cfa04", - "0xc014f8c0", - "0x618378db", - "0xf04f6102", - "0xe9c052a0", - "0xbc102108", - "0x47702000", - "0xbf0e2800", - "0x61012004", - "0x47702000", - "0x48dc4602", - "0x49db6800", - "0x20f040", - "0x46086008", - "0xf0406800", - "0x60080010", - "0x48d74770", - "0x70012170", - "0x70012180", - "0xf0117801", - "0xd0fb0f80", - "0xf0107800", - "0xbf1c0f20", - "0x47702067", - "0xf10f010", - "0x2068bf1c", - "0xf0104770", - "0xbf180001", - "0x47702069", - "0xbf042800", - "0x47702004", - "0x4604b510", - "0xf06f4ac7", - "0x6050403b", - "0x428148c6", - "0x206bbf14", - "0x28002000", - "0xbd10bf18", - "0xf7ff4620", - "0x4603ffd2", - "0xf7ff4620", - "0x4618ffc1", - "0x2800bd10", - "0x2004bf04", - "0x23004770", - "0x60936053", - "0x611360d3", - "0x61936153", - "0x601161d3", - "0x605168c1", - "0x1001e9d0", - "0xf0f0fbb1", - "0x20086090", - "0xe9c22110", - "0xe9c20103", - "0x20041005", - "0x200061d0", - "0xe92d4770", - "0xb0884df0", - "0x46984615", - "0x4682460c", - "0xf7ff466a", - "0x462affd8", - "0x46504621", - "0xf0009b04", - "0x7f92f", - "0xb008bf1c", - "0x8df0e8bd", - "0x4600e9dd", - "0x1e451960", - "0xf0f6fbb5", - "0x5110fb06", - "0x1c40b111", - "0x1e454370", - "0xbf9842ac", - "0xb270f8df", - "0xf024d81c", - "0xf040407f", - "0xf8cb6010", - "0x48990004", - "0xbf144580", - "0x2000206b", - "0xbf1c2800", - "0xe8bdb008", - "0x46508df0", - "0xff75f7ff", - "0xf8da4607", - "0x28000010", - "0x4780bf18", - "0x4434b917", - "0xd9e242ac", - "0xf7ff4650", - "0xb008ff5b", - "0xe8bd4638", - "0x2a008df0", - "0x2004bf04", - "0xe92d4770", - "0xb08945f0", - "0x461e4614", - "0x4680460d", - "0xf7ff466a", - "0x4632ff8a", - "0x46404629", - "0xf0009b03", - "0x7f8e1", - "0xb009bf1c", - "0x85f0e8bd", - "0x2e009d00", - "0xf8dfbf18", - "0xd025a1ec", - "0xb04f854", - "0x8f8ca", - "0x28049803", - "0xf025bf04", - "0xf040407f", - "0xd00960c0", - "0xd1092808", - "0xb04f854", - "0xcf8ca", - "0x407ff025", - "0x60e0f040", - "0x4f8ca", - "0xf7ff4640", - "0xf8d8ff2a", - "0x46071010", - "0xbf182900", - "0xb91f4788", - "0x44059803", - "0xd1d91a36", - "0xf7ff4640", - "0xb009ff0f", - "0xe8bd4638", - "0x280085f0", - "0x2004bf04", - "0x4a634770", - "0x4101ea42", - "0x60514a5f", - "0xe92de70d", - "0xb0884dff", - "0x469a4614", - "0x466a460d", - "0xf7ff9808", - "0x4622ff38", - "0x9b054629", - "0xf0009808", - "0x2800f88f", - "0xb00cbf1c", - "0x8df0e8bd", - "0x4629466a", - "0xf7ff9808", - "0x9e00ff28", - "0x8008f8dd", - "0xf1c84270", - "0x40080100", - "0x42b74247", - "0x4447bf08", - "0xbf182c00", - "0xb128f8df", - "0x1bbdd01f", - "0xbf8842a5", - "0x98054625", - "0x417ff026", - "0xf0f0fbb5", - "0x7180f041", - "0x1004f8cb", - "0xea400400", - "0xf040200a", - "0xf8cb00ff", - "0x98080008", - "0xfecdf7ff", - "0xbf1c2800", - "0xe8bdb00c", - "0x1b648df0", - "0x4447442e", - "0xb00cd1df", - "0xe8bd2000", - "0x2b008df0", - "0x2004bf04", - "0xe92d4770", - "0xb0884dff", - "0xe9dd4616", - "0x461d7a14", - "0x466a460c", - "0x8058f8dd", - "0xf7ff9808", - "0xe9ddfee2", - "0x46323007", - "0xf0004621", - "0x2800f839", - "0xb00cbf1c", - "0x8df0e8bd", - "0x2e009c00", - "0xb00cbf04", - "0x8df0e8bd", - "0xb094f8df", - "0x407ff06f", - "0x6707ea40", - "0x407ff024", - "0x7000f040", - "0x4f8cb", - "0x7008f8cb", - "0xf8cb6828", - "0x9808000c", - "0xfe89f7ff", - "0xf1bab168", - "0xbf180f00", - "0x4000f8ca", - "0xf00f1b8", - "0x2100bf1c", - "0x1000f8c8", - "0xe8bdb00c", - "0x99078df0", - "0xf0211a76", - "0x440d0103", - "0x440c9907", - "0xb00cd1da", - "0x8df0e8bd", - "0xbf042800", - "0x47702004", - "0x42191e5b", - "0x421abf0e", - "0x47702065", - "0x428b6803", - "0x6840d806", - "0x44184411", - "0xbf244288", - "0x47702000", - "0x47702066", - "0x40048000", - "0x3d0", - "0x40020028", - "0x40001400", - "0x40020000", - "0x6b65666b", - "0x4000ffff", - "0x40020004", - "0x40020010", - "0x100008", - "0x200018", - "0x400030", - "0x800060", - "0x10000c0", - "0x2000180", - "0x4000300", - "0x600", - "0x0" - ], - "load_address": "0x20000000", - "min_program_length": "0x8", - "page_buffers": [ - "0x20003000", - "0x20004000" - ], - "page_size": "0x1000", - "pc_eraseAll": "0x2000004f", - "pc_erase_sector": "0x2000006f", - "pc_init": "0x20000021", - "pc_program_page": "0x2000009b", - "pc_unInit": "0x2000004b", - "static_base": "0x200004f4" - }, - "memory_map": [ - { - "blocksize": "0x1000", - "end": "0x7ffff", - "length": "0x80000", - "name": "flash", - "start": "0x0", - "type": "flash" - }, - { - "blocksize": "0x0", - "end": "0x20007fff", - "length": "0x10000", - "name": "ram", - "start": "0x1fff8000", - "type": "ram" - } - ], - "target_name": "ke18f16" - }, - "0217": { - "flash_algo": { - "analyzer_address": "0x1ffff000", - "analyzer_supported": true, - "begin_data": "0x20000a00", - "begin_stack": "0x20000800", - "instructions": [ - "0xe00abe00", - "0x62d780d", - "0x24084068", - "0xd3000040", - "0x1e644058", - "0x1c49d1fa", - "0x2a001e52", - "0x4770d1f2", - "0xb510483e", - "0x5120f24c", - "0xf64d81c1", - "0x81c11128", - "0xf0218801", - "0x80010101", - "0x78414839", - "0x160f001", - "0xbf0c2940", - "0x21002101", - "0x444a4a36", - "0xb1397011", - "0xf0217841", - "0x70410160", - "0xf0117841", - "0xd1fb0f60", - "0x44484831", - "0xf864f000", - "0xbf182800", - "0xbd102001", - "0x4448482c", - "0xb1587800", - "0x78414829", - "0x160f021", - "0x140f041", - "0x78417041", - "0x160f001", - "0xd1fa2940", - "0x47702000", - "0xb5104824", - "0x44484924", - "0xf897f000", - "0xbf182800", - "0x2100bd10", - "0xe8bd481f", - "0x44484010", - "0xb95df000", - "0x4c1cb570", - "0x444c4605", - "0x4b1b4601", - "0x68e24620", - "0xf8bbf000", - "0xbf182800", - "0x2300bd70", - "0x68e24629", - "0x4070e8bd", - "0x44484813", - "0xb951f000", - "0x460cb570", - "0x4606460b", - "0x480f4601", - "0x4615b084", - "0xf0004448", - "0x2800f8f0", - "0xb004bf1c", - "0x2000bd70", - "0xe9cd2101", - "0x90021000", - "0x462b4807", - "0x46314622", - "0xf0004448", - "0xb004f984", - "0xbd70", - "0x40052000", - "0x4007e000", - "0x4", - "0x8", - "0x6b65666b", - "0xbf042800", - "0x47702004", - "0x6cc949ec", - "0x6103f3c1", - "0xbf08290f", - "0x2180f44f", - "0x4ae9bf1f", - "0xf832447a", - "0x2891011", - "0xe9c02200", - "0x21012100", - "0x3096081", - "0x49e460c1", - "0x3f28f811", - "0x7c80f44f", - "0xf303fa0c", - "0x78c96143", - "0x62026102", - "0x61816242", - "0x47704610", - "0xbf0e2800", - "0x61012004", - "0x47702000", - "0x48da4602", - "0x49d96840", - "0x70f440", - "0x47706048", - "0x217048d5", - "0x21807001", - "0x78017001", - "0xf80f011", - "0x7800d0fb", - "0xf20f010", - "0x2067bf1c", - "0xf0104770", - "0xbf1c0f10", - "0x47702068", - "0x1f010", - "0x2069bf18", - "0x28004770", - "0x2004bf04", - "0xb5104770", - "0x4ac64604", - "0x403bf06f", - "0x48c66050", - "0xbf144281", - "0x2000206b", - "0xbf182800", - "0x4620bd10", - "0xffd2f7ff", - "0x46204603", - "0xffc6f7ff", - "0xbd104618", - "0xbf042800", - "0x47702004", - "0x60532300", - "0x60d36093", - "0x61536113", - "0x61d36193", - "0x68c16011", - "0xe9d06051", - "0xfbb11001", - "0x6090f0f0", - "0x21102004", - "0x103e9c2", - "0x1005e9c2", - "0x200061d0", - "0xe92d4770", - "0xb0884df0", - "0x46984615", - "0x4682460c", - "0xf7ff466a", - "0x462affd9", - "0x46504621", - "0xf0009b04", - "0x7f931", - "0xb008bf1c", - "0x8df0e8bd", - "0x4600e9dd", - "0x1e451960", - "0xf0f6fbb5", - "0x5010fb06", - "0xfbb5b120", - "0x1c40f0f6", - "0x1e454370", - "0xbf9842ac", - "0xb268f8df", - "0xf024d81c", - "0xf040407f", - "0xf8cb6010", - "0x48980004", - "0xbf144580", - "0x2000206b", - "0xbf1c2800", - "0xe8bdb008", - "0x46508df0", - "0xff74f7ff", - "0xf8da4607", - "0x28000010", - "0x4780bf18", - "0x4434b917", - "0xd9e242ac", - "0xf7ff4650", - "0xb008ff5f", - "0xe8bd4638", - "0x2a008df0", - "0x2004bf04", - "0xe92d4770", - "0xb08945f0", - "0x461e4614", - "0x4680460d", - "0xf7ff466a", - "0x4632ff89", - "0x46404629", - "0xf0009b03", - "0x7f8e1", - "0xb009bf1c", - "0x85f0e8bd", - "0x2e009d00", - "0xf8dfbf18", - "0xd025a1e4", - "0xb04f854", - "0x8f8ca", - "0x28049803", - "0xf025bf04", - "0xf040407f", - "0xd00960c0", - "0xd1092808", - "0xb04f854", - "0xcf8ca", - "0x407ff025", - "0x60e0f040", - "0x4f8ca", - "0xf7ff4640", - "0xf8d8ff29", - "0x46071010", - "0xbf182900", - "0xb91f4788", - "0x44059803", - "0xd1d91a36", - "0xf7ff4640", - "0xb009ff13", - "0xe8bd4638", - "0x280085f0", - "0x2004bf04", - "0x4a624770", - "0x4101ea42", - "0x60514a5d", - "0xe92de70c", - "0xb0884dff", - "0x469a4614", - "0x466a460d", - "0xf7ff9808", - "0x4622ff37", - "0x9b054629", - "0xf0009808", - "0x2800f88f", - "0xb00cbf1c", - "0x8df0e8bd", - "0x4629466a", - "0xf7ff9808", - "0x9e00ff27", - "0x8008f8dd", - "0xf1c84270", - "0x40080100", - "0x42b74247", - "0x4447bf08", - "0xbf182c00", - "0xb120f8df", - "0x1bbdd01f", - "0xbf8842a5", - "0x98054625", - "0x417ff026", - "0xf0f0fbb5", - "0x7180f041", - "0x1004f8cb", - "0xea400400", - "0xf040200a", - "0xf8cb00ff", - "0x98080008", - "0xfeccf7ff", - "0xbf1c2800", - "0xe8bdb00c", - "0x1b648df0", - "0x4447442e", - "0xb00cd1df", - "0xe8bd2000", - "0x2b008df0", - "0x2004bf04", - "0xe92d4770", - "0xb0884dff", - "0xe9dd4616", - "0x461d7a14", - "0x466a460c", - "0x8058f8dd", - "0xf7ff9808", - "0xe9ddfee1", - "0x46323007", - "0xf0004621", - "0x2800f839", - "0xb00cbf1c", - "0x8df0e8bd", - "0x2e009c00", - "0xb00cbf04", - "0x8df0e8bd", - "0xb08cf8df", - "0x407ff06f", - "0x6707ea40", - "0x407ff024", - "0x7000f040", - "0x4f8cb", - "0x7008f8cb", - "0xf8cb6828", - "0x9808000c", - "0xfe88f7ff", - "0xf1bab168", - "0xbf180f00", - "0x4000f8ca", - "0xf00f1b8", - "0x2100bf1c", - "0x1000f8c8", - "0xe8bdb00c", - "0x99078df0", - "0xf0211a76", - "0x440d0103", - "0x440c9907", - "0xb00cd1da", - "0x8df0e8bd", - "0xbf042800", - "0x47702004", - "0x42191e5b", - "0x421abf0e", - "0x47702065", - "0x428b6803", - "0x6840d806", - "0x44184411", - "0xbf244288", - "0x47702000", - "0x47702066", - "0x40048000", - "0x3bc", - "0x40020000", - "0x4001f000", - "0x6b65666b", - "0x4000ffff", - "0x40020004", - "0x40020010", - "0x100008", - "0x200018", - "0x400030", - "0x800060", - "0x10000c0", - "0x2000180", - "0x4000300", - "0x600", - "0x0", - "0x0" - ], - "load_address": "0x20000000", - "min_program_length": "0x8", - "page_buffers": [ - "0x20003000", - "0x20004000" - ], - "page_size": "0x200", - "pc_eraseAll": "0x20000095", - "pc_erase_sector": "0x200000b5", - "pc_init": "0x20000021", - "pc_program_page": "0x200000e1", - "pc_unInit": "0x20000071", - "static_base": "0x2000052c" - }, - "memory_map": [ - { - "blocksize": "0x1000", - "end": "0x3ffff", - "length": "0x40000", - "name": "flash", - "start": "0x0", - "type": "flash" - }, - { - "blocksize": "0x0", - "end": "0x7ffffff", - "length": "0x4000000", - "name": "rom", - "start": "0x4000000", - "type": "rom" - }, - { - "blocksize": "0x0", - "end": "0xfffffff", - "length": "0x8000000", - "name": "ram", - "start": "0x8000000", - "type": "ram" - }, - { - "blocksize": "0x0", - "end": "0x1bffffff", - "length": "0x4000000", - "name": "ram", - "start": "0x18000000", - "type": "ram" - }, - { - "blocksize": "0x0", - "end": "0x1c007fff", - "length": "0x8000", - "name": "rom", - "start": "0x1c000000", - "type": "rom" - }, - { - "blocksize": "0x0", - "end": "0x2002ffff", - "length": "0x40000", - "name": "ram", - "start": "0x1fff0000", - "type": "ram" - }, - { - "blocksize": "0x0", - "end": "0x6fffffff", - "length": "0x8000000", - "name": "rom", - "start": "0x68000000", - "type": "rom" - }, - { - "blocksize": "0x0", - "end": "0x7fffffff", - "length": "0x10000000", - "name": "ram", - "start": "0x70000000", - "type": "ram" - }, - { - "blocksize": "0x0", - "end": "0x8fffffff", - "length": "0x10000000", - "name": "ram", - "start": "0x80000000", - "type": "ram" - }, - { - "blocksize": "0x0", - "end": "0x9fffffff", - "length": "0x8000000", - "name": "ram", - "start": "0x98000000", - "type": "ram" - }, - { - "blocksize": "0x0", - "end": "0xdfffffff", - "length": "0x40000000", - "name": "ram", - "start": "0xa0000000", - "type": "ram" - } - ], - "target_name": "k82f25615" - }, - "0218": { - "flash_algo": { - "analyzer_address": "0x1fffa000", - "analyzer_supported": true, - "begin_data": "0x20000a00", - "begin_stack": "0x20000800", - "instructions": [ - "0xe00abe00", - "0x62d780d", - "0x24084068", - "0xd3000040", - "0x1e644058", - "0x1c49d1fa", - "0x2a001e52", - "0x4770d1f2", - "0x483bb510", - "0x81c14939", - "0x81c1493a", - "0x8498801", - "0x80010049", - "0x78414838", - "0xf890649", - "0xd0152902", - "0x4a362100", - "0x444a2900", - "0xd0077011", - "0x229f7841", - "0x70414011", - "0x6497841", - "0xd1fb0f89", - "0x44484830", - "0xf862f000", - "0xd0002800", - "0xbd102001", - "0xe7e82101", - "0x4448482a", - "0x28007800", - "0x4827d00a", - "0x229f7841", - "0x31404011", - "0x78417041", - "0xf890649", - "0xd1fa2902", - "0x47702000", - "0xb5104822", - "0x44484922", - "0xf890f000", - "0xd1042800", - "0x2100481e", - "0xf0004448", - "0xbd10f94a", - "0x4c1bb570", - "0x444c4605", - "0x4b1a4601", - "0x68e24620", - "0xf8b7f000", - "0xd1052800", - "0x46292300", - "0x68e24620", - "0xf941f000", - "0xb570bd70", - "0x460b460c", - "0x46014606", - "0xb084480f", - "0x44484615", - "0xf8e6f000", - "0xd10a2800", - "0x90029001", - "0x480a2101", - "0x462b9100", - "0x46314622", - "0xf0004448", - "0xb004f96f", - "0xbd70", - "0xc520", - "0x40052000", - "0xd928", - "0x4007e000", - "0x4", - "0x8", - "0x6b65666b", - "0xd00b2800", - "0x68c949db", - "0xf090109", - "0xd007290f", - "0x494ad9", - "0x5a51447a", - "0xe0030289", - "0x47702004", - "0x4492101", - "0x2200b410", - "0x60416002", - "0x60812101", - "0x60c102c9", - "0x7a0c49d1", - "0x40a3158b", - "0x7ac96143", - "0x62026102", - "0x61816242", - "0x2000bc10", - "0x28004770", - "0x6101d002", - "0x47702000", - "0x47702004", - "0x48c84602", - "0x210168c0", - "0x43080289", - "0x60c849c5", - "0x48c54770", - "0x70012170", - "0x70012180", - "0x6097801", - "0x7800d5fc", - "0xd5010681", - "0x47702067", - "0xd50106c1", - "0x47702068", - "0xd0fc07c0", - "0x47702069", - "0xd1012800", - "0x47702004", - "0x4604b510", - "0x48b84ab7", - "0x48b86050", - "0xd0014281", - "0xe000206b", - "0x28002000", - "0x4620d107", - "0xffd7f7ff", - "0x46204603", - "0xffcaf7ff", - "0xbd104618", - "0xd1012800", - "0x47702004", - "0x4614b510", - "0x60622200", - "0x60e260a2", - "0x61626122", - "0x61e261a2", - "0x68c16021", - "0x68816061", - "0xf0006840", - "0x60a0f951", - "0x20042108", - "0x60e06121", - "0x616161a0", - "0x200061e0", - "0xb5ffbd10", - "0x4615b089", - "0x466a460c", - "0xf7ff9809", - "0x462affd9", - "0x9b044621", - "0xf0009809", - "0x7f90c", - "0x9c00d130", - "0x19659e01", - "0x46311e6d", - "0xf0004628", - "0x2900f92f", - "0x1c40d002", - "0x1e454370", - "0xd81d42ac", - "0x20090221", - "0x6000a09", - "0x488c1809", - "0x498d6041", - "0x4288980c", - "0x206bd001", - "0x2000e000", - "0xd1112800", - "0xf7ff9809", - "0x4607ff80", - "0x69009809", - "0xd0002800", - "0x2f004780", - "0x19a4d102", - "0xd9e142ac", - "0xf7ff9809", - "0x4638ff69", - "0xbdf0b00d", - "0xd1012a00", - "0x47702004", - "0xb089b5ff", - "0x461e4614", - "0x466a460d", - "0xf7ff9809", - "0x4632ff91", - "0x9b034629", - "0xf0009809", - "0x7f8c4", - "0x9d00d12d", - "0xd0262e00", - "0x4870cc02", - "0x99036081", - "0xd0022904", - "0xd0072908", - "0x22ae00e", - "0xa122103", - "0x18510649", - "0xe0076041", - "0x60c1cc02", - "0x2107022a", - "0x6090a12", - "0x60411851", - "0xf7ff9809", - "0x4607ff3c", - "0x69009809", - "0xd0002800", - "0x2f004780", - "0x9803d103", - "0x1a361945", - "0x9809d1d8", - "0xff24f7ff", - "0xb00d4638", - "0x2800bdf0", - "0x4a5cd005", - "0x18890409", - "0x60514a57", - "0x2004e721", - "0xb5ff4770", - "0x4614b08b", - "0x460d461e", - "0x980b466a", - "0xff46f7ff", - "0x46294622", - "0x980b9b05", - "0xf879f000", - "0xd1332800", - "0x4629466a", - "0xf7ff980b", - "0x9d00ff39", - "0x90089802", - "0x42404269", - "0x424f4001", - "0xd10142af", - "0x183f9808", - "0xd0202c00", - "0x90090230", - "0x42a61b7e", - "0x4626d900", - "0x99054630", - "0xf888f000", - "0x2101022a", - "0x6090a12", - "0x493c1852", - "0x9a09604a", - "0x43100400", - "0x608830ff", - "0xf7ff980b", - "0x2800fee4", - "0x9808d106", - "0x19ad1ba4", - "0x2c00183f", - "0x2000d1e0", - "0xbdf0b00f", - "0xd1012b00", - "0x47702004", - "0xb089b5ff", - "0x461d4616", - "0x466a460c", - "0x98099f12", - "0xfefaf7ff", - "0x46214632", - "0x98099b07", - "0xf82df000", - "0xd11d2800", - "0x2e009c00", - "0x4929d01a", - "0x18470638", - "0x20010221", - "0x6400a09", - "0x48211809", - "0x60876041", - "0x60c16829", - "0xf7ff9809", - "0x2800feb0", - "0x9913d00a", - "0xd0002900", - "0x9914600c", - "0xd0012900", - "0x600a2200", - "0xbdf0b00d", - "0x1a769907", - "0x890889", - "0x9907194d", - "0x2e00190c", - "0xb00dd1dc", - "0x2800bdf0", - "0x2004d101", - "0xb4104770", - "0x42191e5b", - "0x421ad101", - "0xbc10d002", - "0x47702065", - "0x428b6803", - "0x6840d804", - "0x18181889", - "0xd2024288", - "0x2066bc10", - "0xbc104770", - "0x47702000", - "0x40048040", - "0x3b4", - "0x40020020", - "0xf0003000", - "0x40020000", - "0x44ffffff", - "0x6b65666b", - "0x4000ffff", - "0xffffff", - "0x460bb530", - "0x20004601", - "0x24012220", - "0x460de009", - "0x429d40d5", - "0x461dd305", - "0x1b494095", - "0x40954625", - "0x46151940", - "0x2d001e52", - "0xbd30dcf1", - "0x40020004", - "0x40020010", - "0x100008", - "0x200018", - "0x400030", - "0x800060", - "0x10000c0", - "0x2000180", - "0x4000300", - "0x600", - "0x0", - "0x0" - ], - "load_address": "0x20000000", - "min_program_length": "0x4", - "page_buffers": [ - "0x20000a00", - "0x20001200" - ], - "page_size": "0x200", - "pc_eraseAll": "0x20000095", - "pc_erase_sector": "0x200000b1", - "pc_init": "0x20000021", - "pc_program_page": "0x200000d7", - "pc_unInit": "0x20000071", - "static_base": "0x20000514" - }, - "memory_map": [ - { - "blocksize": "0x800", - "end": "0x1ffff", - "length": "0x20000", - "name": "flash", - "start": "0x0", - "type": "flash" - }, - { - "blocksize": "0x0", - "end": "0x1c007fff", - "length": "0x8000", - "name": "rom", - "start": "0x1c000000", - "type": "rom" - }, - { - "blocksize": "0x0", - "end": "0x20011fff", - "length": "0x18000", - "name": "ram", - "start": "0x1fffa000", - "type": "ram" - }, - { - "blocksize": "0x0", - "end": "0x6fffffff", - "length": "0x8000000", - "name": "rom", - "start": "0x68000000", - "type": "rom" - } - ], - "target_name": "kl82z7" - }, - "0220": { - "flash_algo": { - "analyzer_address": "0x1ffff000", - "analyzer_supported": true, - "begin_data": "0x20000800", - "begin_stack": "0x20000800", - "instructions": [ - "0xe00abe00", - "0x62d780d", - "0x24084068", - "0xd3000040", - "0x1e644058", - "0x1c49d1fa", - "0x2a001e52", - "0x4770d1f2", - "0x4604b570", - "0x4616460d", - "0x49302000", - "0x48306008", - "0xf0004448", - "0x2800f8e9", - "0x2001d001", - "0x2000bd70", - "0x4601e7fc", - "0x47702000", - "0x492ab510", - "0x44484828", - "0xf8c2f000", - "0x2c004604", - "0x2100d105", - "0x44484824", - "0xf9bef000", - "0xf0004604", - "0x4620f838", - "0xb570bd10", - "0x481f4604", - "0x4b1f4448", - "0x68c24621", - "0xf862f000", - "0x2d004605", - "0x481ad107", - "0x23004448", - "0x68c24621", - "0xf956f000", - "0xf0004605", - "0x4628f820", - "0xb5febd70", - "0x460c4605", - "0x46234616", - "0x46294632", - "0x44484810", - "0xf90af000", - "0x2f004607", - "0x2201d10b", - "0x46339001", - "0x90029200", - "0x46294622", - "0x44484809", - "0xf99af000", - "0xf0004607", - "0x4638f802", - "0x4807bdfe", - "0x210168c0", - "0x43880289", - "0x49041840", - "0x477060c8", - "0x40048100", - "0x4", - "0x6b65666b", - "0xf0003000", - "0x4a102070", - "0x20807010", - "0xbf007010", - "0x7800480d", - "0x280009c0", - "0x480bd0fa", - "0x20207801", - "0x28004008", - "0x2067d001", - "0x20104770", - "0x28004008", - "0x2068d001", - "0x7c8e7f8", - "0x28000fc0", - "0x2069d001", - "0x2000e7f2", - "0xe7f0", - "0x40020000", - "0xb081b5ff", - "0x460d4604", - "0xf0009804", - "0x4606f89f", - "0xd0022e00", - "0xb0054630", - "0x2304bdf0", - "0x46204629", - "0xf0009a03", - "0x4606f876", - "0xd0012e00", - "0xe7f24630", - "0x18289803", - "0x46381e47", - "0xf00068e1", - "0x2900f983", - "0x4638d009", - "0xf00068e1", - "0x1c40f97d", - "0x68e19000", - "0x43489800", - "0xe0131e47", - "0x4478480c", - "0x60056800", - "0x490b2009", - "0xf7ff71c8", - "0x4606ffa7", - "0x280069a0", - "0x69a0d001", - "0x2e004780", - "0xe003d000", - "0x194568e0", - "0xd9e942bd", - "0x4630bf00", - "0xe7c5", - "0x462", - "0x40020000", - "0x4604b570", - "0x4628460d", - "0xf856f000", - "0x2e004606", - "0x4630d001", - "0x2c00bd70", - "0x2004d101", - "0x2044e7fa", - "0x71c84902", - "0xff7ef7ff", - "0xe7f4", - "0x40020000", - "0x29004601", - "0x2004d101", - "0x482a4770", - "0x10068c0", - "0x400f00", - "0x447b4b28", - "0x3025a18", - "0xd1012a00", - "0xe7f12064", - "0x60082000", - "0x2001604a", - "0x2806088", - "0x200060c8", - "0x61486108", - "0xbf006188", - "0x4602e7e4", - "0xd1012a00", - "0x47702004", - "0x20006191", - "0xb530e7fb", - "0x2c004604", - "0x2004d101", - "0x1e58bd30", - "0x28004008", - "0x1e58d103", - "0x28004010", - "0x2065d001", - "0x6820e7f4", - "0xd8054288", - "0x68206865", - "0x188d1940", - "0xd20142a8", - "0xe7e92066", - "0xe7e72000", - "0x480c4601", - "0xd0014281", - "0x4770206b", - "0xe7fc2000", - "0x2b004603", - "0x2004d101", - "0x290f4770", - "0x2a04d801", - "0x2004d001", - "0x2000e7f8", - "0xe7f6", - "0x40048040", - "0x3c0", - "0x6b65666b", - "0xb081b5ff", - "0x46144607", - "0x2c00461d", - "0x2004d102", - "0xbdf0b005", - "0x462a2304", - "0x99024638", - "0xffb7f7ff", - "0x2e004606", - "0x4630d001", - "0xe01ce7f2", - "0x44794910", - "0x68099802", - "0xcc016008", - "0x4479490d", - "0x6809390c", - "0x20066048", - "0x71c8490b", - "0xfef4f7ff", - "0x69b84606", - "0xd0012800", - "0x478069b8", - "0xd0002e00", - "0x9802e005", - "0x90021d00", - "0x2d001f2d", - "0xbf00d1e0", - "0xe7cf4630", - "0x30a", - "0x40020000", - "0xb083b5ff", - "0x2304460c", - "0x9a054621", - "0xf7ff9803", - "0x9002ff82", - "0x28009802", - "0x9802d002", - "0xbdf0b007", - "0x68919a03", - "0xf0006850", - "0x4605f88f", - "0x42684261", - "0x424e4001", - "0xd10042a6", - "0x9f051976", - "0x1b30e027", - "0x98019001", - "0xd90042b8", - "0x98019701", - "0x90000880", - "0x44784811", - "0x60046800", - "0x49102001", - "0x980071c8", - "0xe010400", - "0x72c1480d", - "0x9800490c", - "0x98067288", - "0xf7ff7248", - "0x9002fea3", - "0x28009802", - "0x9802d001", - "0x9801e7cc", - "0x98011a3f", - "0x19761824", - "0x2f00bf00", - "0x2000d1d5", - "0xe7c2", - "0x26e", - "0x40020000", - "0x4604b570", - "0x2c00460d", - "0x2004d101", - "0x2040bd70", - "0x71c84903", - "0x71854608", - "0xfe80f7ff", - "0xe7f6", - "0x40020000", - "0xb081b5ff", - "0x4617460c", - "0x2d00461d", - "0x2004d102", - "0xbdf0b005", - "0x463a2304", - "0x98014621", - "0xff19f7ff", - "0x2e004606", - "0x4630d001", - "0xe022e7f2", - "0x44784813", - "0x60046800", - "0x49122002", - "0x980a71c8", - "0x490f72c8", - "0x39124479", - "0x68096828", - "0xf7ff6088", - "0x4606fe55", - "0xd00b2e00", - "0x2800980b", - "0x980bd001", - "0x980c6004", - "0xd0022800", - "0x980c2100", - "0xe0046001", - "0x1d2d1f3f", - "0x2f001d24", - "0xbf00d1da", - "0xe7c94630", - "0x1ce", - "0x40020000", - "0x9032200", - "0xd32c428b", - "0x428b0a03", - "0x2300d311", - "0xe04e469c", - "0x430b4603", - "0x2200d43c", - "0x428b0843", - "0x903d331", - "0xd31c428b", - "0x428b0a03", - "0x4694d301", - "0x9c3e03f", - "0xd301428b", - "0x1ac001cb", - "0x9834152", - "0xd301428b", - "0x1ac0018b", - "0x9434152", - "0xd301428b", - "0x1ac0014b", - "0x9034152", - "0xd301428b", - "0x1ac0010b", - "0x8c34152", - "0xd301428b", - "0x1ac000cb", - "0x8834152", - "0xd301428b", - "0x1ac0008b", - "0x8434152", - "0xd301428b", - "0x1ac0004b", - "0x1a414152", - "0x4601d200", - "0x46104152", - "0xe05d4770", - "0xd0000fca", - "0x10034249", - "0x4240d300", - "0x22004053", - "0x903469c", - "0xd32d428b", - "0x428b0a03", - "0x22fcd312", - "0xba120189", - "0x428b0a03", - "0x189d30c", - "0x428b1192", - "0x189d308", - "0x428b1192", - "0x189d304", - "0x1192d03a", - "0x989e000", - "0x428b09c3", - "0x1cbd301", - "0x41521ac0", - "0x428b0983", - "0x18bd301", - "0x41521ac0", - "0x428b0943", - "0x14bd301", - "0x41521ac0", - "0x428b0903", - "0x10bd301", - "0x41521ac0", - "0x428b08c3", - "0xcbd301", - "0x41521ac0", - "0x428b0883", - "0x8bd301", - "0x41521ac0", - "0x843d2d9", - "0xd301428b", - "0x1ac0004b", - "0x1a414152", - "0x4601d200", - "0x41524663", - "0x4610105b", - "0x4240d301", - "0xd5002b00", - "0x47704249", - "0x105b4663", - "0x4240d300", - "0x2000b501", - "0x46c046c0", - "0x2bd02", - "0x4", - "0x8", - "0x10", - "0x20", - "0x40", - "0x0", - "0x0", - "0x20", - "0x40020004", - "0x0" - ], - "load_address": "0x20000000", - "min_program_length": "0x4", - "page_buffers": [ - "0x20000800", - "0x20000c00" - ], - "pc_eraseAll": "0x20000049", - "pc_erase_sector": "0x2000006f", - "pc_init": "0x20000021", - "pc_program_page": "0x2000009f", - "static_base": "0x20000608" - }, - "memory_map": [ - { - "blocksize": "0x400", - "end": "0x3ffff", - "length": "0x40000", - "name": "flash", - "start": "0x0", - "type": "flash" - }, - { - "blocksize": "0x0", - "end": "0x20005fff", - "length": "0x8000", - "name": "ram", - "start": "0x1fffe000", - "type": "ram" - } - ], - "target_name": "kl46z" - }, - "0224": { - "flash_algo": { - "analyzer_address": "0x1ffff000", - "analyzer_supported": true, - "begin_data": "0x20000a00", - "begin_stack": "0x20000800", - "instructions": [ - "0xe00abe00", - "0x62d780d", - "0x24084068", - "0xd3000040", - "0x1e644058", - "0x1c49d1fa", - "0x2a001e52", - "0x4770d1f2", - "0xb510482e", - "0x5120f24c", - "0xf64d81c1", - "0x81c11128", - "0xf0218801", - "0x80010101", - "0x44484829", - "0xf856f000", - "0xbf182800", - "0xbd102001", - "0x47702000", - "0xb5104824", - "0x44484924", - "0xf926f000", - "0x4821b920", - "0x44482100", - "0xf9daf000", - "0x684a4920", - "0x270f442", - "0xbd10604a", - "0x4c1bb570", - "0x444c4605", - "0x4b1a4601", - "0x68e24620", - "0xf88ef000", - "0x2300b928", - "0x46204629", - "0xf00068e2", - "0x4915f91f", - "0xf442684a", - "0x604a0270", - "0xb570bd70", - "0x460b460c", - "0x46014606", - "0xb084480d", - "0x44484615", - "0xf8b8f000", - "0x2000b958", - "0xe9cd2101", - "0x90021000", - "0x462b4807", - "0x46314622", - "0xf0004448", - "0x4906f963", - "0xf442684a", - "0x604a0270", - "0xbd70b004", - "0x40052000", - "0x4", - "0x6b65666b", - "0x4001f000", - "0xbf042800", - "0x47702004", - "0x6cc94926", - "0xe094a26", - "0xf832447a", - "0x3091011", - "0x2064bf04", - "0x22004770", - "0x2100e9c0", - "0x60812104", - "0x60c10289", - "0x780b491f", - "0x7c80f44f", - "0xf303fa0c", - "0x78c96103", - "0x1205e9c0", - "0x47704610", - "0xbf0e2800", - "0x61812004", - "0x47702000", - "0xbf042800", - "0x47702004", - "0x42191e5b", - "0x421abf0e", - "0x47702065", - "0x428b6803", - "0x6840d806", - "0x44184411", - "0xbf244288", - "0x47702000", - "0x47702066", - "0x4288490c", - "0x206bbf14", - "0x47702000", - "0x290fb140", - "0x2a04d802", - "0xe005d104", - "0xbf982913", - "0xd0012a08", - "0x47702004", - "0x47702000", - "0x40048000", - "0x36c", - "0x40020028", - "0x6b65666b", - "0x4df0e92d", - "0x46154606", - "0x4618460c", - "0xffdcf7ff", - "0xbf182800", - "0x8df0e8bd", - "0x462a2310", - "0x46304621", - "0xffbcf7ff", - "0xbf180007", - "0x8df0e8bd", - "0x1e451960", - "0xfbb568f0", - "0xfb00f1f0", - "0xb1125211", - "0x43481c49", - "0x42ac1e45", - "0xf8dfd817", - "0x44f88034", - "0xb030f8df", - "0xa09f04f", - "0xf8d8", - "0xf88b6004", - "0xf000a007", - "0x4607f917", - "0x280069b0", - "0x4780bf18", - "0x68f0b91f", - "0x42ac4404", - "0x4638d9ee", - "0x8df0e8bd", - "0x27a", - "0x40020000", - "0xbf042a00", - "0x47702004", - "0x4df0e92d", - "0x4614461d", - "0x4607460e", - "0x462a2308", - "0xff7ef7ff", - "0xb00ea5f", - "0xe8bdbf18", - "0x2d008df0", - "0xf8dfbf1e", - "0x44f8804c", - "0xa07f04f", - "0xf8d8d01c", - "0x60060000", - "0x1000f8d8", - "0xb04f854", - "0xf8d86048", - "0xf8541000", - "0x60880b04", - "0xf880480a", - "0xf000a007", - "0x4683f8d9", - "0x280069b8", - "0x4780bf18", - "0xf00f1bb", - "0x3608d102", - "0xd1e23d08", - "0xe8bd4658", - "0x8df0", - "0x212", - "0x40020000", - "0x4604b510", - "0xf7ff4608", - "0x2800ff5d", - "0xbd10bf18", - "0xbf042c00", - "0xbd102004", - "0x49032044", - "0xe8bd71c8", - "0xf0004010", - "0xb8b3", - "0x40020000", - "0x4df0e92d", - "0x4614469a", - "0x4605460e", - "0xf7ff2310", - "0x2800ff2d", - "0xe8bdbf18", - "0xe9d58df0", - "0xfbb00101", - "0x4270f8f1", - "0x100f1c8", - "0x42474008", - "0xbf0842b7", - "0x2c004447", - "0xf8dfbf18", - "0xd01cb044", - "0x42a51bbd", - "0x4625bf88", - "0x490e0928", - "0x68094479", - "0x2101600e", - "0x1007f88b", - "0xf88b0a01", - "0xf88b100b", - "0xf88b000a", - "0xf000a009", - "0x2800f87d", - "0xe8bdbf18", - "0x1b648df0", - "0x4447442e", - "0x2000d1e2", - "0x8df0e8bd", - "0x40020000", - "0x14c", - "0xbf122800", - "0x20042a00", - "0x29084770", - "0xe8dfd215", - "0x604f001", - "0xc0a0806", - "0x68c0100e", - "0x6840e00a", - "0x6880e008", - "0x6800e006", - "0x2001e004", - "0x6900e002", - "0x6940e000", - "0x20006010", - "0x206a4770", - "0x4770", - "0xbf042b00", - "0x47702004", - "0x4df0e92d", - "0xe9dd461c", - "0x46158709", - "0x2304460e", - "0xa020f8dd", - "0xfec4f7ff", - "0xbf182800", - "0x8df0e8bd", - "0xbf1a2d00", - "0xb04cf8df", - "0xe8bd44fb", - "0xf8db8df0", - "0x60060000", - "0x21024810", - "0xf88071c1", - "0xf8dba00b", - "0x68201000", - "0xf0006088", - "0xb150f825", - "0xf00f1b8", - "0xf8c8bf18", - "0x2f006000", - "0x2100bf1c", - "0xe8bd6039", - "0x1f2d8df0", - "0x404f104", - "0x604f106", - "0xe8bdd1df", - "0x8df0", - "0xa0", - "0x40020000", - "0xbf042800", - "0x47702004", - "0x48022240", - "0x718171c2", - "0xb802f000", - "0x40020000", - "0x2170480c", - "0x21807001", - "0x78017001", - "0xf80f011", - "0x7800d0fb", - "0xf20f010", - "0x2067bf1c", - "0xf0104770", - "0xbf1c0f10", - "0x47702068", - "0x1f010", - "0x2069bf18", - "0x4770", - "0x40020000", - "0x40020004", - "0x0", - "0x80000", - "0x100000", - "0x200000", - "0x400000", - "0x800000", - "0x1000000", - "0x2000000", - "0x0" - ], - "load_address": "0x20000000", - "min_program_length": "0x8", - "page_buffers": [ - "0x20003000", - "0x20004000" - ], - "pc_eraseAll": "0x2000004d", - "pc_erase_sector": "0x20000071", - "pc_init": "0x20000021", - "pc_program_page": "0x2000009f", - "pc_unInit": "0x20000049", - "static_base": "0x2000048c" - }, - "memory_map": [ - { - "blocksize": "0x1000", - "end": "0x1fffff", - "length": "0x200000", - "name": "flash", - "start": "0x0", - "type": "flash" - }, - { - "blocksize": "0x0", - "end": "0x14000fff", - "length": "0x1000", - "name": "ram", - "start": "0x14000000", - "type": "ram" - }, - { - "blocksize": "0x0", - "end": "0x2003ffff", - "length": "0x80000", - "name": "ram", - "start": "0x1ffc0000", - "type": "ram" - }, - { - "blocksize": "0x0", - "end": "0x3407ffff", - "length": "0x80000", - "name": "ram", - "start": "0x34000000", - "type": "ram" - } - ], - "target_name": "k28f15" - }, - "0230": { - "flash_algo": { - "analyzer_address": "0x1fffe000", - "analyzer_supported": true, - "begin_data": "0x20001c00", - "begin_stack": "0x20000c00", - "instructions": [ - "0xe00abe00", - "0x62d780d", - "0x24084068", - "0xd3000040", - "0x1e644058", - "0x1c49d1fa", - "0x2a001e52", - "0x4770d1f2", - "0x4604b570", - "0x4616460d", - "0x5020f24c", - "0x81c84932", - "0x1028f64d", - "0x460881c8", - "0xf0208800", - "0x80080001", - "0x4448482e", - "0xf8dcf000", - "0x2001b108", - "0x2000bd70", - "0x4601e7fc", - "0x47702000", - "0x4929b510", - "0x44484827", - "0xf8b8f000", - "0xb92c4604", - "0x48242100", - "0xf0004448", - "0x4604f9a3", - "0xf837f000", - "0xbd104620", - "0x4604b570", - "0x4448481e", - "0x46214b1e", - "0xf00068c2", - "0x4605f85d", - "0x481ab93d", - "0x23004448", - "0x68c24621", - "0xf940f000", - "0xf0004605", - "0x4628f820", - "0xb5febd70", - "0x460c4605", - "0x46234616", - "0x46294632", - "0x44484810", - "0xf8f8f000", - "0xb9674607", - "0x22012000", - "0x2000e9cd", - "0x46224633", - "0x90024629", - "0x44484809", - "0xf97ef000", - "0xf0004607", - "0x4638f802", - "0x4807bdfe", - "0xf4206840", - "0xf5000070", - "0x49040070", - "0x47706048", - "0x40052000", - "0x4", - "0x6b65666b", - "0x4001f000", - "0x4a0e2070", - "0x20807010", - "0xbf007010", - "0x7800480b", - "0x280009c0", - "0x4809d0fa", - "0xf0017801", - "0xb1080020", - "0x47702067", - "0x10f001", - "0x2068b108", - "0xf001e7f9", - "0xb1080001", - "0xe7f42069", - "0xe7f22000", - "0x40020000", - "0x4df0e92d", - "0x460d4604", - "0x469a4690", - "0xf0004650", - "0x4606f891", - "0x4630b116", - "0x8df0e8bd", - "0x46422304", - "0x46204629", - "0xf86cf000", - "0xb10e4606", - "0xe7f34630", - "0x8eb05", - "0x68e01e47", - "0xf1f0fbb7", - "0x7011fb00", - "0x68e0b140", - "0xf0f0fbb7", - "0xb01f100", - "0xfb0068e0", - "0x1e47f00b", - "0x480be011", - "0x68004478", - "0x20096005", - "0x71c84909", - "0xffacf7ff", - "0x69a04606", - "0x69a0b108", - "0xb1064780", - "0x68e0e003", - "0x42bd4405", - "0xbf00d9eb", - "0xe7c94630", - "0x2e0", - "0x40020000", - "0x4604b570", - "0x4628460d", - "0xf84ef000", - "0xb10e4606", - "0xbd704630", - "0x2004b90c", - "0x2044e7fb", - "0x71c84902", - "0xff88f7ff", - "0xe7f5", - "0x40020000", - "0xb9094601", - "0x47702004", - "0x6cc04826", - "0x6003f3c0", - "0x447b4b25", - "0x10f833", - "0xb90a0302", - "0xe7f22064", - "0x60082000", - "0x2001604a", - "0x2806088", - "0x200060c8", - "0x61486108", - "0xbf006188", - "0x4602e7e5", - "0x2004b90a", - "0x61914770", - "0xe7fb2000", - "0x4604b530", - "0x2004b90c", - "0x1e58bd30", - "0xb9104008", - "0x40101e58", - "0x2065b108", - "0x6820e7f6", - "0xd8054288", - "0x500e9d4", - "0x188d4428", - "0xd20142a8", - "0xe7eb2066", - "0xe7e92000", - "0x480b4601", - "0xd0014281", - "0x4770206b", - "0xe7fc2000", - "0xb90b4603", - "0x47702004", - "0xd801290f", - "0xd0012a04", - "0xe7f82004", - "0xe7f62000", - "0x40048000", - "0x24e", - "0x6b65666b", - "0x41f0e92d", - "0x46884607", - "0x461d4614", - "0x2004b914", - "0x81f0e8bd", - "0x462a2304", - "0x46384641", - "0xffbcf7ff", - "0xb10e4606", - "0xe7f34630", - "0x480fe019", - "0x68004478", - "0x8000f8c0", - "0x490ccc01", - "0x390c4479", - "0x60486809", - "0x490a2006", - "0xf7ff71c8", - "0x4606ff07", - "0xb10869b8", - "0x478069b8", - "0xe004b106", - "0x804f108", - "0x2d001f2d", - "0xbf00d1e3", - "0xe7d34630", - "0x1a4", - "0x40020000", - "0x4dffe92d", - "0x4682b082", - "0x2304460c", - "0x46504621", - "0xf7ff9a04", - "0x4683ff89", - "0xf00f1bb", - "0x4658d003", - "0xe8bdb006", - "0xe9da8df0", - "0xfbb00101", - "0x4260f7f1", - "0x40084279", - "0x42a54245", - "0x443dd100", - "0xe0229e04", - "0x804eba5", - "0xd90045b0", - "0xea4f46b0", - "0x90010098", - "0x4478480f", - "0x60046800", - "0x490e2001", - "0x980171c8", - "0x72c80a00", - "0x72889801", - "0x72489805", - "0xfebcf7ff", - "0xf1bb4683", - "0xd0010f00", - "0xe7d14658", - "0x608eba6", - "0x443d4444", - "0x2e00bf00", - "0x2000d1da", - "0xe7c8", - "0x10e", - "0x40020000", - "0x4604b570", - "0xb90c460d", - "0xbd702004", - "0x49032040", - "0x460871c8", - "0xf7ff7185", - "0xe7f6fe9b", - "0x40020000", - "0x4dffe92d", - "0x4617460c", - "0xe9dd461d", - "0xf8ddb80c", - "0xb91da038", - "0xb0042004", - "0x8df0e8bd", - "0x463a2304", - "0x98004621", - "0xff24f7ff", - "0xb10e4606", - "0xe7f24630", - "0x4814e022", - "0x68004478", - "0x20026004", - "0x71c84912", - "0xf8804608", - "0x490fb00b", - "0x39144479", - "0x68096828", - "0xf7ff6088", - "0x4606fe6d", - "0xf1b8b15e", - "0xd0010f00", - "0x4000f8c8", - "0xf00f1ba", - "0x2000d002", - "0xf8ca", - "0x1f3fe004", - "0x1d241d2d", - "0xd1da2f00", - "0x4630bf00", - "0xe7c9", - "0x74", - "0x40020000", - "0x0", - "0x80000", - "0x100000", - "0x200000", - "0x400000", - "0x800000", - "0x1000000", - "0x1000000", - "0x40020004", - "0x0" - ], - "load_address": "0x20000000", - "min_program_length": "0x8", - "page_buffers": [ - "0x20001800", - "0x20001c00" - ], - "pc_eraseAll": "0x20000059", - "pc_erase_sector": "0x2000007d", - "pc_init": "0x20000021", - "pc_program_page": "0x200000ab", - "static_base": "0x20000488" - }, - "memory_map": [ - { - "blocksize": "0x400", - "end": "0x1ffff", - "length": "0x20000", - "name": "flash", - "start": "0x0", - "type": "flash" - }, - { - "blocksize": "0x0", - "end": "0x20001fff", - "length": "0x4000", - "name": "ram", - "start": "0x1fffe000", - "type": "ram" - } - ], - "target_name": "k20d50m" - }, - "0231": { - "flash_algo": { - "analyzer_address": "0x1ffff000", - "analyzer_supported": true, - "begin_data": "0x20001000", - "begin_stack": "0x20000800", - "instructions": [ - "0xe00abe00", - "0x62d780d", - "0x24084068", - "0xd3000040", - "0x1e644058", - "0x1c49d1fa", - "0x2a001e52", - "0x4770d1f2", - "0x4604b570", - "0x4616460d", - "0x5020f24c", - "0x81c84932", - "0x1028f64d", - "0x460881c8", - "0xf0208800", - "0x80080001", - "0x4448482e", - "0xf8dcf000", - "0x2001b108", - "0x2000bd70", - "0x4601e7fc", - "0x47702000", - "0x4929b510", - "0x44484827", - "0xf8b8f000", - "0xb92c4604", - "0x48242100", - "0xf0004448", - "0x4604f9b5", - "0xf837f000", - "0xbd104620", - "0x4604b570", - "0x4448481e", - "0x46214b1e", - "0xf00068c2", - "0x4605f85d", - "0x481ab93d", - "0x23004448", - "0x68c24621", - "0xf952f000", - "0xf0004605", - "0x4628f820", - "0xb5febd70", - "0x460c4605", - "0x46234616", - "0x46294632", - "0x44484810", - "0xf90af000", - "0xb9674607", - "0x22012000", - "0x2000e9cd", - "0x46224633", - "0x90024629", - "0x44484809", - "0xf990f000", - "0xf0004607", - "0x4638f802", - "0x4807bdfe", - "0xf4206840", - "0xf5000070", - "0x49040070", - "0x47706048", - "0x40052000", - "0x4", - "0x6b65666b", - "0x4001f000", - "0x4a0e2070", - "0x20807010", - "0xbf007010", - "0x7800480b", - "0x280009c0", - "0x4809d0fa", - "0xf0017801", - "0xb1080020", - "0x47702067", - "0x10f001", - "0x2068b108", - "0xf001e7f9", - "0xb1080001", - "0xe7f42069", - "0xe7f22000", - "0x40020000", - "0x4df0e92d", - "0x460d4604", - "0x469a4690", - "0xf0004650", - "0x4606f899", - "0x4630b116", - "0x8df0e8bd", - "0x46422308", - "0x46204629", - "0xf874f000", - "0xb10e4606", - "0xe7f34630", - "0x8eb05", - "0x68e01e47", - "0xf1f0fbb7", - "0x7011fb00", - "0x68e0b140", - "0xf0f0fbb7", - "0xb01f100", - "0xfb0068e0", - "0x1e47f00b", - "0x480be011", - "0x68004478", - "0x20096005", - "0x71c84909", - "0xffacf7ff", - "0x69a04606", - "0x69a0b108", - "0xb1064780", - "0x68e0e003", - "0x42bd4405", - "0xbf00d9eb", - "0xe7c94630", - "0x304", - "0x40020000", - "0x4604b570", - "0x4628460d", - "0xf856f000", - "0xb10e4606", - "0xbd704630", - "0x2004b90c", - "0x2044e7fb", - "0x71c84902", - "0xff88f7ff", - "0xe7f5", - "0x40020000", - "0xb9094601", - "0x47702004", - "0x6cc0482e", - "0x6003f3c0", - "0x447b4b2d", - "0x10f833", - "0xb90a0302", - "0xe7f22064", - "0x60082000", - "0x2002604a", - "0x2806088", - "0x482760c8", - "0x15807803", - "0x61084098", - "0x38284824", - "0x2bf890", - "0x20006148", - "0xbf006188", - "0x4602e7dd", - "0x2004b90a", - "0x61914770", - "0xe7fb2000", - "0x4604b530", - "0x2004b90c", - "0x1e58bd30", - "0xb9104008", - "0x40101e58", - "0x2065b108", - "0x6820e7f6", - "0xd8054288", - "0x500e9d4", - "0x188d4428", - "0xd20142a8", - "0xe7eb2066", - "0xe7e92000", - "0x48104601", - "0xd0014281", - "0x4770206b", - "0xe7fc2000", - "0xb90b4603", - "0x47702004", - "0xd803290f", - "0xd0092a04", - "0xe7f82004", - "0xd8032913", - "0xd0032a08", - "0xe7f22004", - "0xe7f02004", - "0xe7ee2000", - "0x40048000", - "0x272", - "0x40020028", - "0x6b65666b", - "0x41f0e92d", - "0x46884607", - "0x461d4614", - "0x2004b914", - "0x81f0e8bd", - "0x462a2304", - "0x46384641", - "0xffb2f7ff", - "0xb10e4606", - "0xe7f34630", - "0x480fe019", - "0x68004478", - "0x8000f8c0", - "0x490ccc01", - "0x390c4479", - "0x60486809", - "0x490a2006", - "0xf7ff71c8", - "0x4606fef5", - "0xb10869b8", - "0x478069b8", - "0xe004b106", - "0x804f108", - "0x2d001f2d", - "0xbf00d1e3", - "0xe7d34630", - "0x1a4", - "0x40020000", - "0x4dffe92d", - "0x4682b082", - "0x2308460c", - "0x46504621", - "0xf7ff9a04", - "0x4683ff7f", - "0xf00f1bb", - "0x4658d003", - "0xe8bdb006", - "0xe9da8df0", - "0xfbb00101", - "0x4260f7f1", - "0x40084279", - "0x42a54245", - "0x443dd100", - "0xe0229e04", - "0x804eba5", - "0xd90045b0", - "0xea4f46b0", - "0x900100d8", - "0x4478480f", - "0x60046800", - "0x490e2001", - "0x980171c8", - "0x72c80a00", - "0x72889801", - "0x72489805", - "0xfeaaf7ff", - "0xf1bb4683", - "0xd0010f00", - "0xe7d14658", - "0x608eba6", - "0x443d4444", - "0x2e00bf00", - "0x2000d1da", - "0xe7c8", - "0x10e", - "0x40020000", - "0x4604b570", - "0xb90c460d", - "0xbd702004", - "0x49032040", - "0x460871c8", - "0xf7ff7185", - "0xe7f6fe89", - "0x40020000", - "0x4dffe92d", - "0x4617460c", - "0xe9dd461d", - "0xf8ddb80c", - "0xb91da038", - "0xb0042004", - "0x8df0e8bd", - "0x463a2304", - "0x98004621", - "0xff1af7ff", - "0xb10e4606", - "0xe7f24630", - "0x4814e022", - "0x68004478", - "0x20026004", - "0x71c84912", - "0xf8804608", - "0x490fb00b", - "0x39144479", - "0x68096828", - "0xf7ff6088", - "0x4606fe5b", - "0xf1b8b15e", - "0xd0010f00", - "0x4000f8c8", - "0xf00f1ba", - "0x2000d002", - "0xf8ca", - "0x1f3fe004", - "0x1d241d2d", - "0xd1da2f00", - "0x4630bf00", - "0xe7c9", - "0x74", - "0x40020000", - "0x0", - "0x80000", - "0x100000", - "0x200000", - "0x400000", - "0x800000", - "0x1000000", - "0x1000000", - "0x40020004", - "0x0" - ], - "load_address": "0x20000000", - "min_program_length": "0x8", - "page_buffers": [ - "0x20001000", - "0x20001800" - ], - "pc_eraseAll": "0x20000059", - "pc_erase_sector": "0x2000007d", - "pc_init": "0x20000021", - "pc_program_page": "0x200000ab", - "static_base": "0x200004ac" - }, - "memory_map": [ - { - "blocksize": "0x800", - "end": "0x7ffff", - "length": "0x80000", - "name": "flash", - "start": "0x0", - "type": "flash" - }, - { - "blocksize": "0x0", - "end": "0x2000ffff", - "length": "0x20000", - "name": "ram", - "start": "0x1fff0000", - "type": "ram" - } - ], - "target_name": "k22f" - }, - "0240": { - "flash_algo": { - "analyzer_address": "0x1ffff000", - "analyzer_supported": true, - "begin_data": "0x20003000", - "begin_stack": "0x20001000", - "instructions": [ - "0xe00abe00", - "0x62d780d", - "0x24084068", - "0xd3000040", - "0x1e644058", - "0x1c49d1fa", - "0x2a001e52", - "0x4770d1f2", - "0x4604b570", - "0x4616460d", - "0x5020f24c", - "0x81c84932", - "0x1028f64d", - "0x460881c8", - "0xf0208800", - "0x80080001", - "0x4448482e", - "0xf8dcf000", - "0x2001b108", - "0x2000bd70", - "0x4601e7fc", - "0x47702000", - "0x4929b510", - "0x44484827", - "0xf8b8f000", - "0xb92c4604", - "0x48242100", - "0xf0004448", - "0x4604f9a9", - "0xf837f000", - "0xbd104620", - "0x4604b570", - "0x4448481e", - "0x46214b1e", - "0xf00068c2", - "0x4605f85d", - "0x481ab93d", - "0x23004448", - "0x68c24621", - "0xf946f000", - "0xf0004605", - "0x4628f820", - "0xb5febd70", - "0x460c4605", - "0x46234616", - "0x46294632", - "0x44484810", - "0xf8f8f000", - "0xb9674607", - "0x22012000", - "0x2000e9cd", - "0x46224633", - "0x90024629", - "0x44484809", - "0xf984f000", - "0xf0004607", - "0x4638f802", - "0x4807bdfe", - "0xf4206840", - "0xf5000070", - "0x49040070", - "0x47706048", - "0x40052000", - "0x4", - "0x6b65666b", - "0x4001f000", - "0x4a0e2070", - "0x20807010", - "0xbf007010", - "0x7800480b", - "0x280009c0", - "0x4809d0fa", - "0xf0017801", - "0xb1080020", - "0x47702067", - "0x10f001", - "0x2068b108", - "0xf001e7f9", - "0xb1080001", - "0xe7f42069", - "0xe7f22000", - "0x40020000", - "0x4df0e92d", - "0x460d4604", - "0x469a4690", - "0xf0004650", - "0x4606f891", - "0x4630b116", - "0x8df0e8bd", - "0x46422310", - "0x46204629", - "0xf86cf000", - "0xb10e4606", - "0xe7f34630", - "0x8eb05", - "0x68e01e47", - "0xf1f0fbb7", - "0x7011fb00", - "0x68e0b140", - "0xf0f0fbb7", - "0xb01f100", - "0xfb0068e0", - "0x1e47f00b", - "0x480be011", - "0x68004478", - "0x20096005", - "0x71c84909", - "0xffacf7ff", - "0x69a04606", - "0x69a0b108", - "0xb1064780", - "0x68e0e003", - "0x42bd4405", - "0xbf00d9eb", - "0xe7c94630", - "0x2ec", - "0x40020000", - "0x4604b570", - "0x4628460d", - "0xf84ef000", - "0xb10e4606", - "0xbd704630", - "0x2004b90c", - "0x2044e7fb", - "0x71c84902", - "0xff88f7ff", - "0xe7f5", - "0x40020000", - "0xb9094601", - "0x47702004", - "0x6cc04826", - "0x6003f3c0", - "0x447b4b25", - "0x10f833", - "0xb90a0302", - "0xe7f22064", - "0x60082000", - "0x2002604a", - "0x2c06088", - "0x200060c8", - "0x61486108", - "0xbf006188", - "0x4602e7e5", - "0x2004b90a", - "0x61914770", - "0xe7fb2000", - "0x4604b530", - "0x2004b90c", - "0x1e58bd30", - "0xb9104008", - "0x40101e58", - "0x2065b108", - "0x6820e7f6", - "0xd8054288", - "0x500e9d4", - "0x188d4428", - "0xd20142a8", - "0xe7eb2066", - "0xe7e92000", - "0x480b4601", - "0xd0014281", - "0x4770206b", - "0xe7fc2000", - "0xb90b4603", - "0x47702004", - "0xd801290f", - "0xd0012a04", - "0xe7f82004", - "0xe7f62000", - "0x40048000", - "0x25a", - "0x6b65666b", - "0x41f0e92d", - "0x46884607", - "0x461d4614", - "0x2004b914", - "0x81f0e8bd", - "0x462a2308", - "0x46384641", - "0xffbcf7ff", - "0xb10e4606", - "0xe7f34630", - "0x4812e01f", - "0x68004478", - "0x8000f8c0", - "0x490fcc01", - "0x390c4479", - "0x60486809", - "0x490ccc01", - "0x39184479", - "0x60886809", - "0x490a2007", - "0xf7ff71c8", - "0x4606ff01", - "0xb10869b8", - "0x478069b8", - "0xe004b106", - "0x808f108", - "0x2d003d08", - "0xbf00d1dd", - "0xe7cd4630", - "0x1b0", - "0x40020000", - "0x4dffe92d", - "0x4682b082", - "0x2310460c", - "0x46504621", - "0xf7ff9a04", - "0x4683ff83", - "0xf00f1bb", - "0x4658d003", - "0xe8bdb006", - "0xe9da8df0", - "0xfbb00101", - "0x4260f7f1", - "0x40084279", - "0x42a54245", - "0x443dd100", - "0xe0229e04", - "0x804eba5", - "0xd90045b0", - "0xea4f46b0", - "0x90011018", - "0x4478480f", - "0x60046800", - "0x490e2001", - "0x980171c8", - "0x72c80a00", - "0x72889801", - "0x72489805", - "0xfeb6f7ff", - "0xf1bb4683", - "0xd0010f00", - "0xe7d14658", - "0x608eba6", - "0x443d4444", - "0x2e00bf00", - "0x2000d1da", - "0xe7c8", - "0x10e", - "0x40020000", - "0x4604b570", - "0xb90c460d", - "0xbd702004", - "0x49032040", - "0x460871c8", - "0xf7ff7185", - "0xe7f6fe95", - "0x40020000", - "0x4dffe92d", - "0x4617460c", - "0xe9dd461d", - "0xf8ddb80c", - "0xb91da038", - "0xb0042004", - "0x8df0e8bd", - "0x463a2304", - "0x98004621", - "0xff1ef7ff", - "0xb10e4606", - "0xe7f24630", - "0x4814e022", - "0x68004478", - "0x20026004", - "0x71c84912", - "0xf8804608", - "0x490fb00b", - "0x39144479", - "0x68096828", - "0xf7ff6088", - "0x4606fe67", - "0xf1b8b15e", - "0xd0010f00", - "0x4000f8c8", - "0xf00f1ba", - "0x2000d002", - "0xf8ca", - "0x1f3fe004", - "0x1d241d2d", - "0xd1da2f00", - "0x4630bf00", - "0xe7c9", - "0x74", - "0x40020000", - "0x0", - "0x80000", - "0x100000", - "0x200000", - "0x400000", - "0x800000", - "0x1000000", - "0x1000000", - "0x40020004", - "0x0" - ], - "load_address": "0x20000000", - "min_program_length": "0x8", - "page_buffers": [ - "0x20003000", - "0x20004000" - ], - "pc_eraseAll": "0x20000059", - "pc_erase_sector": "0x2000007d", - "pc_init": "0x20000021", - "pc_program_page": "0x200000ab", - "static_base": "0x20000494" - }, - "memory_map": [ - { - "blocksize": "0x1000", - "end": "0xfffff", - "length": "0x100000", - "name": "flash", - "start": "0x0", - "type": "flash" - }, - { - "blocksize": "0x0", - "end": "0x2002ffff", - "length": "0x40000", - "name": "ram", - "start": "0x1fff0000", - "type": "ram" - } - ], - "target_name": "k64f" - }, - "0260": { - "flash_algo": { - "analyzer_address": "0x1ffff000", - "analyzer_supported": true, - "begin_data": "0x20000800", - "begin_stack": "0x20000800", - "instructions": [ - "0xe00abe00", - "0x62d780d", - "0x24084068", - "0xd3000040", - "0x1e644058", - "0x1c49d1fa", - "0x2a001e52", - "0x4770d1f2", - "0x4604b570", - "0x4616460d", - "0x49302000", - "0x48306008", - "0xf0004448", - "0x2800f8e9", - "0x2001d001", - "0x2000bd70", - "0x4601e7fc", - "0x47702000", - "0x492ab510", - "0x44484828", - "0xf8c2f000", - "0x2c004604", - "0x2100d105", - "0x44484824", - "0xf9bef000", - "0xf0004604", - "0x4620f838", - "0xb570bd10", - "0x481f4604", - "0x4b1f4448", - "0x68c24621", - "0xf862f000", - "0x2d004605", - "0x481ad107", - "0x23004448", - "0x68c24621", - "0xf956f000", - "0xf0004605", - "0x4628f820", - "0xb5febd70", - "0x460c4605", - "0x46234616", - "0x46294632", - "0x44484810", - "0xf90af000", - "0x2f004607", - "0x2201d10b", - "0x46339001", - "0x90029200", - "0x46294622", - "0x44484809", - "0xf99af000", - "0xf0004607", - "0x4638f802", - "0x4807bdfe", - "0x210168c0", - "0x43880289", - "0x49041840", - "0x477060c8", - "0x40048100", - "0x4", - "0x6b65666b", - "0xf0003000", - "0x4a102070", - "0x20807010", - "0xbf007010", - "0x7800480d", - "0x280009c0", - "0x480bd0fa", - "0x20207801", - "0x28004008", - "0x2067d001", - "0x20104770", - "0x28004008", - "0x2068d001", - "0x7c8e7f8", - "0x28000fc0", - "0x2069d001", - "0x2000e7f2", - "0xe7f0", - "0x40020000", - "0xb081b5ff", - "0x460d4604", - "0xf0009804", - "0x4606f89f", - "0xd0022e00", - "0xb0054630", - "0x2304bdf0", - "0x46204629", - "0xf0009a03", - "0x4606f876", - "0xd0012e00", - "0xe7f24630", - "0x18289803", - "0x46381e47", - "0xf00068e1", - "0x2900f983", - "0x4638d009", - "0xf00068e1", - "0x1c40f97d", - "0x68e19000", - "0x43489800", - "0xe0131e47", - "0x4478480c", - "0x60056800", - "0x490b2009", - "0xf7ff71c8", - "0x4606ffa7", - "0x280069a0", - "0x69a0d001", - "0x2e004780", - "0xe003d000", - "0x194568e0", - "0xd9e942bd", - "0x4630bf00", - "0xe7c5", - "0x462", - "0x40020000", - "0x4604b570", - "0x4628460d", - "0xf856f000", - "0x2e004606", - "0x4630d001", - "0x2c00bd70", - "0x2004d101", - "0x2044e7fa", - "0x71c84902", - "0xff7ef7ff", - "0xe7f4", - "0x40020000", - "0x29004601", - "0x2004d101", - "0x482a4770", - "0x10068c0", - "0x400f00", - "0x447b4b28", - "0x3025a18", - "0xd1012a00", - "0xe7f12064", - "0x60082000", - "0x2001604a", - "0x2806088", - "0x200060c8", - "0x61486108", - "0xbf006188", - "0x4602e7e4", - "0xd1012a00", - "0x47702004", - "0x20006191", - "0xb530e7fb", - "0x2c004604", - "0x2004d101", - "0x1e58bd30", - "0x28004008", - "0x1e58d103", - "0x28004010", - "0x2065d001", - "0x6820e7f4", - "0xd8054288", - "0x68206865", - "0x188d1940", - "0xd20142a8", - "0xe7e92066", - "0xe7e72000", - "0x480c4601", - "0xd0014281", - "0x4770206b", - "0xe7fc2000", - "0x2b004603", - "0x2004d101", - "0x290f4770", - "0x2a04d801", - "0x2004d001", - "0x2000e7f8", - "0xe7f6", - "0x40048040", - "0x3c0", - "0x6b65666b", - "0xb081b5ff", - "0x46144607", - "0x2c00461d", - "0x2004d102", - "0xbdf0b005", - "0x462a2304", - "0x99024638", - "0xffb7f7ff", - "0x2e004606", - "0x4630d001", - "0xe01ce7f2", - "0x44794910", - "0x68099802", - "0xcc016008", - "0x4479490d", - "0x6809390c", - "0x20066048", - "0x71c8490b", - "0xfef4f7ff", - "0x69b84606", - "0xd0012800", - "0x478069b8", - "0xd0002e00", - "0x9802e005", - "0x90021d00", - "0x2d001f2d", - "0xbf00d1e0", - "0xe7cf4630", - "0x30a", - "0x40020000", - "0xb083b5ff", - "0x2304460c", - "0x9a054621", - "0xf7ff9803", - "0x9002ff82", - "0x28009802", - "0x9802d002", - "0xbdf0b007", - "0x68919a03", - "0xf0006850", - "0x4605f88f", - "0x42684261", - "0x424e4001", - "0xd10042a6", - "0x9f051976", - "0x1b30e027", - "0x98019001", - "0xd90042b8", - "0x98019701", - "0x90000880", - "0x44784811", - "0x60046800", - "0x49102001", - "0x980071c8", - "0xe010400", - "0x72c1480d", - "0x9800490c", - "0x98067288", - "0xf7ff7248", - "0x9002fea3", - "0x28009802", - "0x9802d001", - "0x9801e7cc", - "0x98011a3f", - "0x19761824", - "0x2f00bf00", - "0x2000d1d5", - "0xe7c2", - "0x26e", - "0x40020000", - "0x4604b570", - "0x2c00460d", - "0x2004d101", - "0x2040bd70", - "0x71c84903", - "0x71854608", - "0xfe80f7ff", - "0xe7f6", - "0x40020000", - "0xb081b5ff", - "0x4617460c", - "0x2d00461d", - "0x2004d102", - "0xbdf0b005", - "0x463a2304", - "0x98014621", - "0xff19f7ff", - "0x2e004606", - "0x4630d001", - "0xe022e7f2", - "0x44784813", - "0x60046800", - "0x49122002", - "0x980a71c8", - "0x490f72c8", - "0x39124479", - "0x68096828", - "0xf7ff6088", - "0x4606fe55", - "0xd00b2e00", - "0x2800980b", - "0x980bd001", - "0x980c6004", - "0xd0022800", - "0x980c2100", - "0xe0046001", - "0x1d2d1f3f", - "0x2f001d24", - "0xbf00d1da", - "0xe7c94630", - "0x1ce", - "0x40020000", - "0x9032200", - "0xd32c428b", - "0x428b0a03", - "0x2300d311", - "0xe04e469c", - "0x430b4603", - "0x2200d43c", - "0x428b0843", - "0x903d331", - "0xd31c428b", - "0x428b0a03", - "0x4694d301", - "0x9c3e03f", - "0xd301428b", - "0x1ac001cb", - "0x9834152", - "0xd301428b", - "0x1ac0018b", - "0x9434152", - "0xd301428b", - "0x1ac0014b", - "0x9034152", - "0xd301428b", - "0x1ac0010b", - "0x8c34152", - "0xd301428b", - "0x1ac000cb", - "0x8834152", - "0xd301428b", - "0x1ac0008b", - "0x8434152", - "0xd301428b", - "0x1ac0004b", - "0x1a414152", - "0x4601d200", - "0x46104152", - "0xe05d4770", - "0xd0000fca", - "0x10034249", - "0x4240d300", - "0x22004053", - "0x903469c", - "0xd32d428b", - "0x428b0a03", - "0x22fcd312", - "0xba120189", - "0x428b0a03", - "0x189d30c", - "0x428b1192", - "0x189d308", - "0x428b1192", - "0x189d304", - "0x1192d03a", - "0x989e000", - "0x428b09c3", - "0x1cbd301", - "0x41521ac0", - "0x428b0983", - "0x18bd301", - "0x41521ac0", - "0x428b0943", - "0x14bd301", - "0x41521ac0", - "0x428b0903", - "0x10bd301", - "0x41521ac0", - "0x428b08c3", - "0xcbd301", - "0x41521ac0", - "0x428b0883", - "0x8bd301", - "0x41521ac0", - "0x843d2d9", - "0xd301428b", - "0x1ac0004b", - "0x1a414152", - "0x4601d200", - "0x41524663", - "0x4610105b", - "0x4240d301", - "0xd5002b00", - "0x47704249", - "0x105b4663", - "0x4240d300", - "0x2000b501", - "0x46c046c0", - "0x2bd02", - "0x4", - "0x8", - "0x10", - "0x20", - "0x40", - "0x0", - "0x0", - "0x20", - "0x40020004", - "0x0" - ], - "load_address": "0x20000000", - "min_program_length": "0x4", - "page_buffers": [ - "0x20000800", - "0x20000c00" - ], - "pc_eraseAll": "0x20000049", - "pc_erase_sector": "0x2000006f", - "pc_init": "0x20000021", - "pc_program_page": "0x2000009f", - "static_base": "0x20000608" - }, - "memory_map": [ - { - "blocksize": "0x400", - "end": "0x1ffff", - "length": "0x20000", - "name": "flash", - "start": "0x0", - "type": "flash" - }, - { - "blocksize": "0x0", - "end": "0x20002fff", - "length": "0x4000", - "name": "ram", - "start": "0x1ffff000", - "type": "ram" - } - ], - "target_name": "kl26z" - }, - "0261": { - "flash_algo": { - "analyzer_address": "0x20002000", - "analyzer_supported": true, - "begin_data": "0x20000a00", - "begin_stack": "0x20000800", - "instructions": [ - "0xe00abe00", - "0x62d780d", - "0x24084068", - "0xd3000040", - "0x1e644058", - "0x1c49d1fa", - "0x2a001e52", - "0x4770d1f2", - "0x9032200", - "0xd373428b", - "0x428b0a03", - "0xb03d358", - "0xd33c428b", - "0x428b0c03", - "0xe012d321", - "0x430b4603", - "0x2200d47f", - "0x428b0843", - "0x903d374", - "0xd35f428b", - "0x428b0a03", - "0xb03d344", - "0xd328428b", - "0x428b0c03", - "0x22ffd30d", - "0xba120209", - "0x428b0c03", - "0x1212d302", - "0xd0650209", - "0x428b0b03", - "0xe000d319", - "0xbc30a09", - "0xd301428b", - "0x1ac003cb", - "0xb834152", - "0xd301428b", - "0x1ac0038b", - "0xb434152", - "0xd301428b", - "0x1ac0034b", - "0xb034152", - "0xd301428b", - "0x1ac0030b", - "0xac34152", - "0xd301428b", - "0x1ac002cb", - "0xa834152", - "0xd301428b", - "0x1ac0028b", - "0xa434152", - "0xd301428b", - "0x1ac0024b", - "0xa034152", - "0xd301428b", - "0x1ac0020b", - "0xd2cd4152", - "0x428b09c3", - "0x1cbd301", - "0x41521ac0", - "0x428b0983", - "0x18bd301", - "0x41521ac0", - "0x428b0943", - "0x14bd301", - "0x41521ac0", - "0x428b0903", - "0x10bd301", - "0x41521ac0", - "0x428b08c3", - "0xcbd301", - "0x41521ac0", - "0x428b0883", - "0x8bd301", - "0x41521ac0", - "0x428b0843", - "0x4bd301", - "0x41521ac0", - "0xd2001a41", - "0x41524601", - "0x47704610", - "0xfcae05d", - "0x4249d000", - "0xd3001003", - "0x40534240", - "0x469c2200", - "0x428b0903", - "0xa03d32d", - "0xd312428b", - "0x18922fc", - "0xa03ba12", - "0xd30c428b", - "0x11920189", - "0xd308428b", - "0x11920189", - "0xd304428b", - "0xd03a0189", - "0xe0001192", - "0x9c30989", - "0xd301428b", - "0x1ac001cb", - "0x9834152", - "0xd301428b", - "0x1ac0018b", - "0x9434152", - "0xd301428b", - "0x1ac0014b", - "0x9034152", - "0xd301428b", - "0x1ac0010b", - "0x8c34152", - "0xd301428b", - "0x1ac000cb", - "0x8834152", - "0xd301428b", - "0x1ac0008b", - "0xd2d94152", - "0x428b0843", - "0x4bd301", - "0x41521ac0", - "0xd2001a41", - "0x46634601", - "0x105b4152", - "0xd3014610", - "0x2b004240", - "0x4249d500", - "0x46634770", - "0xd300105b", - "0xb5014240", - "0x46c02000", - "0xbd0246c0", - "0xb510480a", - "0x44484908", - "0xf8ecf000", - "0xd1042800", - "0x21004806", - "0xf0004448", - "0x4a05f9b1", - "0x230168d1", - "0x4319029b", - "0xbd1060d1", - "0x6b65666b", - "0x4", - "0xf0003000", - "0x4c0cb570", - "0x444c4605", - "0x4b0b4601", - "0x68e24620", - "0xf894f000", - "0xd1052800", - "0x46292300", - "0x68e24620", - "0xf956f000", - "0x68ca4905", - "0x29b2301", - "0x60ca431a", - "0xbd70", - "0x4", - "0x6b65666b", - "0xf0003000", - "0x4905b510", - "0x60082000", - "0x44484804", - "0xf8e8f000", - "0xd0002800", - "0xbd102001", - "0x40048100", - "0x4", - "0x460cb570", - "0x4606460b", - "0x480d4601", - "0x4615b084", - "0xf0004448", - "0x2800f8f5", - "0x9001d10a", - "0x21019002", - "0x91004807", - "0x4622462b", - "0x44484631", - "0xf96af000", - "0x68ca4904", - "0x29b2301", - "0x60ca431a", - "0xbd70b004", - "0x4", - "0xf0003000", - "0x47702000", - "0xd0032800", - "0xd801290f", - "0xd0012a04", - "0x47702004", - "0x47702000", - "0xd1012800", - "0x47702004", - "0x1e5bb410", - "0x421c460c", - "0x421ad101", - "0xbc10d002", - "0x47702065", - "0x428b6803", - "0x6840d804", - "0x18181889", - "0xd2024288", - "0x2066bc10", - "0xbc104770", - "0x47702000", - "0x42884903", - "0x206bd001", - "0x20004770", - "0x4770", - "0x6b65666b", - "0x2170480a", - "0x21807001", - "0x78017001", - "0xd5fc0609", - "0x6817800", - "0x2067d501", - "0x6c14770", - "0x2068d501", - "0x7c04770", - "0x2069d0fc", - "0x4770", - "0x40020000", - "0x4605b5f8", - "0x460c4616", - "0xf7ff4618", - "0x2800ffd7", - "0x2304d12b", - "0x46214632", - "0xf7ff4628", - "0x7ffb3", - "0x19a6d123", - "0x68e91e76", - "0x91004630", - "0xfe3cf7ff", - "0xd0032900", - "0x1c409e00", - "0x1e764346", - "0xd81342b4", - "0x4478480a", - "0x60046800", - "0x20094909", - "0xf7ff71c8", - "0x4607ffbf", - "0x280069a8", - "0x4780d000", - "0xd1032f00", - "0x190468e8", - "0xd9eb42b4", - "0xbdf84638", - "0x26a", - "0x40020000", - "0x4604b510", - "0xf7ff4608", - "0x2800ff9f", - "0x2c00d106", - "0x4904d005", - "0x71c82044", - "0xffa0f7ff", - "0x2004bd10", - "0xbd10", - "0x40020000", - "0xd00c2800", - "0xd00a2a00", - "0xd21a2908", - "0x447b000b", - "0x18db791b", - "0x705449f", - "0xd0b0907", - "0x2004110f", - "0x68c04770", - "0x6840e00a", - "0x6880e008", - "0x6800e006", - "0x2000e004", - "0x6900e002", - "0x6940e000", - "0x20006010", - "0x206a4770", - "0x4770", - "0xd0142800", - "0x68c9490c", - "0xe094a0c", - "0x447a0049", - "0x3095a51", - "0x2200d00d", - "0x60416002", - "0x60812102", - "0x61426102", - "0x61820249", - "0x461060c1", - "0x20044770", - "0x20644770", - "0x4770", - "0x40048040", - "0x19a", - "0xd1012a00", - "0x47702004", - "0x461cb5ff", - "0x4615b081", - "0x2304460e", - "0x98014622", - "0xff22f7ff", - "0xd1190007", - "0xd0162c00", - "0x4478480c", - "0x600e6801", - "0x6800cd02", - "0x490a6041", - "0x71c82006", - "0xff38f7ff", - "0x98014607", - "0x28006980", - "0x4780d000", - "0xd1022f00", - "0x1f241d36", - "0x4638d1e8", - "0xbdf0b005", - "0x162", - "0x40020000", - "0xd0022800", - "0x20006181", - "0x20044770", - "0x4770", - "0xb081b5ff", - "0x460e4614", - "0x23044605", - "0xfef0f7ff", - "0xd12a2800", - "0x686868a9", - "0xfd7cf7ff", - "0x42719000", - "0x40014240", - "0x42b7424f", - "0x9800d101", - "0x2c00183f", - "0x1bbdd01a", - "0xd90042a5", - "0x490d4625", - "0x447908a8", - "0x600e6809", - "0x2201490b", - "0xa0271ca", - "0x728872ca", - "0x72489804", - "0xfef2f7ff", - "0xd1062800", - "0x1b649800", - "0x183f1976", - "0xd1e42c00", - "0xb0052000", - "0xbdf0", - "0xda", - "0x40020000", - "0xd1012800", - "0x47702004", - "0x4803b510", - "0x71c22240", - "0xf7ff7181", - "0xbd10fed7", - "0x40020000", - "0xd1012b00", - "0x47702004", - "0x461cb5f8", - "0x460e4615", - "0x9f082304", - "0xfea2f7ff", - "0xd1192800", - "0xd0172d00", - "0x447a4a0f", - "0x60066810", - "0x2102480e", - "0x990671c1", - "0x681172c1", - "0x60886820", - "0xfeb6f7ff", - "0xd0082800", - "0x29009907", - "0x600ed000", - "0xd0012f00", - "0x60392100", - "0x1f2dbdf8", - "0x1d361d24", - "0xd1e12d00", - "0xbdf8", - "0x62", - "0x40020000", - "0x40002", - "0x80000", - "0x100000", - "0x200000", - "0x400000", - "0x0", - "0x0", - "0x100000", - "0x40020004", - "0x0" - ], - "load_address": "0x20000000", - "min_program_length": "0x4", - "page_buffers": [ - "0x20000a00", - "0x20001200" - ], - "pc_eraseAll": "0x20000209", - "pc_erase_sector": "0x2000023d", - "pc_init": "0x2000027d", - "pc_program_page": "0x2000029d", - "pc_unInit": "0x200002e5", - "static_base": "0x2000062c" - }, - "memory_map": [ - { - "blocksize": "0x400", - "end": "0xffff", - "length": "0x10000", - "name": "flash", - "start": "0x0", - "type": "flash" - }, - { - "blocksize": "0x0", - "end": "0x20002fff", - "length": "0x4000", - "name": "ram", - "start": "0x1ffff000", - "type": "ram" - } - ], - "target_name": "kl27z4" - }, - "0262": { - "flash_algo": { - "analyzer_address": "0x20002000", - "analyzer_supported": true, - "begin_data": "0x20000a00", - "begin_stack": "0x20000800", - "instructions": [ - "0xe00abe00", - "0x62d780d", - "0x24084068", - "0xd3000040", - "0x1e644058", - "0x1c49d1fa", - "0x2a001e52", - "0x4770d1f2", - "0x9032200", - "0xd373428b", - "0x428b0a03", - "0xb03d358", - "0xd33c428b", - "0x428b0c03", - "0xe012d321", - "0x430b4603", - "0x2200d47f", - "0x428b0843", - "0x903d374", - "0xd35f428b", - "0x428b0a03", - "0xb03d344", - "0xd328428b", - "0x428b0c03", - "0x22ffd30d", - "0xba120209", - "0x428b0c03", - "0x1212d302", - "0xd0650209", - "0x428b0b03", - "0xe000d319", - "0xbc30a09", - "0xd301428b", - "0x1ac003cb", - "0xb834152", - "0xd301428b", - "0x1ac0038b", - "0xb434152", - "0xd301428b", - "0x1ac0034b", - "0xb034152", - "0xd301428b", - "0x1ac0030b", - "0xac34152", - "0xd301428b", - "0x1ac002cb", - "0xa834152", - "0xd301428b", - "0x1ac0028b", - "0xa434152", - "0xd301428b", - "0x1ac0024b", - "0xa034152", - "0xd301428b", - "0x1ac0020b", - "0xd2cd4152", - "0x428b09c3", - "0x1cbd301", - "0x41521ac0", - "0x428b0983", - "0x18bd301", - "0x41521ac0", - "0x428b0943", - "0x14bd301", - "0x41521ac0", - "0x428b0903", - "0x10bd301", - "0x41521ac0", - "0x428b08c3", - "0xcbd301", - "0x41521ac0", - "0x428b0883", - "0x8bd301", - "0x41521ac0", - "0x428b0843", - "0x4bd301", - "0x41521ac0", - "0xd2001a41", - "0x41524601", - "0x47704610", - "0xfcae05d", - "0x4249d000", - "0xd3001003", - "0x40534240", - "0x469c2200", - "0x428b0903", - "0xa03d32d", - "0xd312428b", - "0x18922fc", - "0xa03ba12", - "0xd30c428b", - "0x11920189", - "0xd308428b", - "0x11920189", - "0xd304428b", - "0xd03a0189", - "0xe0001192", - "0x9c30989", - "0xd301428b", - "0x1ac001cb", - "0x9834152", - "0xd301428b", - "0x1ac0018b", - "0x9434152", - "0xd301428b", - "0x1ac0014b", - "0x9034152", - "0xd301428b", - "0x1ac0010b", - "0x8c34152", - "0xd301428b", - "0x1ac000cb", - "0x8834152", - "0xd301428b", - "0x1ac0008b", - "0xd2d94152", - "0x428b0843", - "0x4bd301", - "0x41521ac0", - "0xd2001a41", - "0x46634601", - "0x105b4152", - "0xd3014610", - "0x2b004240", - "0x4249d500", - "0x46634770", - "0xd300105b", - "0xb5014240", - "0x46c02000", - "0xbd0246c0", - "0xb510480a", - "0x44484908", - "0xf8ecf000", - "0xd1042800", - "0x21004806", - "0xf0004448", - "0x4a05f9b1", - "0x230168d1", - "0x4319029b", - "0xbd1060d1", - "0x6b65666b", - "0x4", - "0xf0003000", - "0x4c0cb570", - "0x444c4605", - "0x4b0b4601", - "0x68e24620", - "0xf894f000", - "0xd1052800", - "0x46292300", - "0x68e24620", - "0xf956f000", - "0x68ca4905", - "0x29b2301", - "0x60ca431a", - "0xbd70", - "0x4", - "0x6b65666b", - "0xf0003000", - "0x4905b510", - "0x60082000", - "0x44484804", - "0xf8e8f000", - "0xd0002800", - "0xbd102001", - "0x40048100", - "0x4", - "0x460cb570", - "0x4606460b", - "0x480d4601", - "0x4615b084", - "0xf0004448", - "0x2800f8f5", - "0x9001d10a", - "0x21019002", - "0x91004807", - "0x4622462b", - "0x44484631", - "0xf96af000", - "0x68ca4904", - "0x29b2301", - "0x60ca431a", - "0xbd70b004", - "0x4", - "0xf0003000", - "0x47702000", - "0xd0032800", - "0xd801290f", - "0xd0012a04", - "0x47702004", - "0x47702000", - "0xd1012800", - "0x47702004", - "0x1e5bb410", - "0x421c460c", - "0x421ad101", - "0xbc10d002", - "0x47702065", - "0x428b6803", - "0x6840d804", - "0x18181889", - "0xd2024288", - "0x2066bc10", - "0xbc104770", - "0x47702000", - "0x42884903", - "0x206bd001", - "0x20004770", - "0x4770", - "0x6b65666b", - "0x2170480a", - "0x21807001", - "0x78017001", - "0xd5fc0609", - "0x6817800", - "0x2067d501", - "0x6c14770", - "0x2068d501", - "0x7c04770", - "0x2069d0fc", - "0x4770", - "0x40020000", - "0x4605b5f8", - "0x460c4616", - "0xf7ff4618", - "0x2800ffd7", - "0x2304d12b", - "0x46214632", - "0xf7ff4628", - "0x7ffb3", - "0x19a6d123", - "0x68e91e76", - "0x91004630", - "0xfe3cf7ff", - "0xd0032900", - "0x1c409e00", - "0x1e764346", - "0xd81342b4", - "0x4478480a", - "0x60046800", - "0x20094909", - "0xf7ff71c8", - "0x4607ffbf", - "0x280069a8", - "0x4780d000", - "0xd1032f00", - "0x190468e8", - "0xd9eb42b4", - "0xbdf84638", - "0x26a", - "0x40020000", - "0x4604b510", - "0xf7ff4608", - "0x2800ff9f", - "0x2c00d106", - "0x4904d005", - "0x71c82044", - "0xffa0f7ff", - "0x2004bd10", - "0xbd10", - "0x40020000", - "0xd00c2800", - "0xd00a2a00", - "0xd21a2908", - "0x447b000b", - "0x18db791b", - "0x705449f", - "0xd0b0907", - "0x2004110f", - "0x68c04770", - "0x6840e00a", - "0x6880e008", - "0x6800e006", - "0x2000e004", - "0x6900e002", - "0x6940e000", - "0x20006010", - "0x206a4770", - "0x4770", - "0xd0142800", - "0x68c9490c", - "0xe094a0c", - "0x447a0049", - "0x3095a51", - "0x2200d00d", - "0x60416002", - "0x60812102", - "0x61426102", - "0x61820249", - "0x461060c1", - "0x20044770", - "0x20644770", - "0x4770", - "0x40048040", - "0x19a", - "0xd1012a00", - "0x47702004", - "0x461cb5ff", - "0x4615b081", - "0x2304460e", - "0x98014622", - "0xff22f7ff", - "0xd1190007", - "0xd0162c00", - "0x4478480c", - "0x600e6801", - "0x6800cd02", - "0x490a6041", - "0x71c82006", - "0xff38f7ff", - "0x98014607", - "0x28006980", - "0x4780d000", - "0xd1022f00", - "0x1f241d36", - "0x4638d1e8", - "0xbdf0b005", - "0x162", - "0x40020000", - "0xd0022800", - "0x20006181", - "0x20044770", - "0x4770", - "0xb081b5ff", - "0x460e4614", - "0x23044605", - "0xfef0f7ff", - "0xd12a2800", - "0x686868a9", - "0xfd7cf7ff", - "0x42719000", - "0x40014240", - "0x42b7424f", - "0x9800d101", - "0x2c00183f", - "0x1bbdd01a", - "0xd90042a5", - "0x490d4625", - "0x447908a8", - "0x600e6809", - "0x2201490b", - "0xa0271ca", - "0x728872ca", - "0x72489804", - "0xfef2f7ff", - "0xd1062800", - "0x1b649800", - "0x183f1976", - "0xd1e42c00", - "0xb0052000", - "0xbdf0", - "0xda", - "0x40020000", - "0xd1012800", - "0x47702004", - "0x4803b510", - "0x71c22240", - "0xf7ff7181", - "0xbd10fed7", - "0x40020000", - "0xd1012b00", - "0x47702004", - "0x461cb5f8", - "0x460e4615", - "0x9f082304", - "0xfea2f7ff", - "0xd1192800", - "0xd0172d00", - "0x447a4a0f", - "0x60066810", - "0x2102480e", - "0x990671c1", - "0x681172c1", - "0x60886820", - "0xfeb6f7ff", - "0xd0082800", - "0x29009907", - "0x600ed000", - "0xd0012f00", - "0x60392100", - "0x1f2dbdf8", - "0x1d361d24", - "0xd1e12d00", - "0xbdf8", - "0x62", - "0x40020000", - "0x40002", - "0x80000", - "0x100000", - "0x200000", - "0x400000", - "0x0", - "0x0", - "0x400000", - "0x40020004", - "0x0" - ], - "load_address": "0x20000000", - "min_program_length": "0x4", - "page_buffers": [ - "0x20000a00", - "0x20001200" - ], - "pc_eraseAll": "0x20000209", - "pc_erase_sector": "0x2000023d", - "pc_init": "0x2000027d", - "pc_program_page": "0x2000029d", - "pc_unInit": "0x200002e5", - "static_base": "0x2000062c" - }, - "memory_map": [ - { - "blocksize": "0x400", - "end": "0x3ffff", - "length": "0x40000", - "name": "flash", - "start": "0x0", - "type": "flash" - }, - { - "blocksize": "0x0", - "end": "0x20005fff", - "length": "0x8000", - "name": "ram", - "start": "0x1fffe000", - "type": "ram" - } - ], - "target_name": "kl43z4" - }, - "0290": { - "flash_algo": { - "analyzer_address": "0x1ffff800", - "analyzer_supported": true, - "begin_data": "0x20000a00", - "begin_stack": "0x20000800", - "instructions": [ - "0xe00abe00", - "0x62d780d", - "0x24084068", - "0xd3000040", - "0x1e644058", - "0x1c49d1fa", - "0x2a001e52", - "0x4770d1f2", - "0x9032200", - "0xd373428b", - "0x428b0a03", - "0xb03d358", - "0xd33c428b", - "0x428b0c03", - "0xe012d321", - "0x430b4603", - "0x2200d47f", - "0x428b0843", - "0x903d374", - "0xd35f428b", - "0x428b0a03", - "0xb03d344", - "0xd328428b", - "0x428b0c03", - "0x22ffd30d", - "0xba120209", - "0x428b0c03", - "0x1212d302", - "0xd0650209", - "0x428b0b03", - "0xe000d319", - "0xbc30a09", - "0xd301428b", - "0x1ac003cb", - "0xb834152", - "0xd301428b", - "0x1ac0038b", - "0xb434152", - "0xd301428b", - "0x1ac0034b", - "0xb034152", - "0xd301428b", - "0x1ac0030b", - "0xac34152", - "0xd301428b", - "0x1ac002cb", - "0xa834152", - "0xd301428b", - "0x1ac0028b", - "0xa434152", - "0xd301428b", - "0x1ac0024b", - "0xa034152", - "0xd301428b", - "0x1ac0020b", - "0xd2cd4152", - "0x428b09c3", - "0x1cbd301", - "0x41521ac0", - "0x428b0983", - "0x18bd301", - "0x41521ac0", - "0x428b0943", - "0x14bd301", - "0x41521ac0", - "0x428b0903", - "0x10bd301", - "0x41521ac0", - "0x428b08c3", - "0xcbd301", - "0x41521ac0", - "0x428b0883", - "0x8bd301", - "0x41521ac0", - "0x428b0843", - "0x4bd301", - "0x41521ac0", - "0xd2001a41", - "0x41524601", - "0x47704610", - "0xfcae05d", - "0x4249d000", - "0xd3001003", - "0x40534240", - "0x469c2200", - "0x428b0903", - "0xa03d32d", - "0xd312428b", - "0x18922fc", - "0xa03ba12", - "0xd30c428b", - "0x11920189", - "0xd308428b", - "0x11920189", - "0xd304428b", - "0xd03a0189", - "0xe0001192", - "0x9c30989", - "0xd301428b", - "0x1ac001cb", - "0x9834152", - "0xd301428b", - "0x1ac0018b", - "0x9434152", - "0xd301428b", - "0x1ac0014b", - "0x9034152", - "0xd301428b", - "0x1ac0010b", - "0x8c34152", - "0xd301428b", - "0x1ac000cb", - "0x8834152", - "0xd301428b", - "0x1ac0008b", - "0xd2d94152", - "0x428b0843", - "0x4bd301", - "0x41521ac0", - "0xd2001a41", - "0x46634601", - "0x105b4152", - "0xd3014610", - "0x2b004240", - "0x4249d500", - "0x46634770", - "0xd300105b", - "0xb5014240", - "0x46c02000", - "0xbd0246c0", - "0xb510480a", - "0x44484908", - "0xf8f2f000", - "0xd1042800", - "0x21004806", - "0xf0004448", - "0x4a05f9bf", - "0x230168d1", - "0x4319029b", - "0xbd1060d1", - "0x6b65666b", - "0x4", - "0xf0003000", - "0x4c0cb570", - "0x444c4605", - "0x4b0b4601", - "0x68e24620", - "0xf89af000", - "0xd1052800", - "0x46292300", - "0x68e24620", - "0xf964f000", - "0x68ca4905", - "0x29b2301", - "0x60ca431a", - "0xbd70", - "0x4", - "0x6b65666b", - "0xf0003000", - "0x4905b510", - "0x60082000", - "0x44484804", - "0xf8eef000", - "0xd0002800", - "0xbd102001", - "0x40048100", - "0x4", - "0x460cb570", - "0x4606460b", - "0x480d4601", - "0x4615b084", - "0xf0004448", - "0x2800f903", - "0x9001d10a", - "0x21019002", - "0x91004807", - "0x4622462b", - "0x44484631", - "0xf978f000", - "0x68ca4904", - "0x29b2301", - "0x60ca431a", - "0xbd70b004", - "0x4", - "0xf0003000", - "0x47702000", - "0xd0082800", - "0xd802290f", - "0xd1042a04", - "0x2913e005", - "0x2a08d801", - "0x2004d001", - "0x20004770", - "0x28004770", - "0x2004d101", - "0xb4104770", - "0x460c1e5b", - "0xd101421c", - "0xd002421a", - "0x2065bc10", - "0x68034770", - "0xd804428b", - "0x18896840", - "0x42881818", - "0xbc10d202", - "0x47702066", - "0x2000bc10", - "0x4770", - "0x42884903", - "0x206bd001", - "0x20004770", - "0x4770", - "0x6b65666b", - "0x2170480a", - "0x21807001", - "0x78017001", - "0xd5fc0609", - "0x6817800", - "0x2067d501", - "0x6c14770", - "0x2068d501", - "0x7c04770", - "0x2069d0fc", - "0x4770", - "0x40020000", - "0x4605b5f8", - "0x460c4616", - "0xf7ff4618", - "0x2800ffd7", - "0x2304d12b", - "0x46214632", - "0xf7ff4628", - "0x7ffb2", - "0x19a6d123", - "0x68e91e76", - "0x91004630", - "0xfe36f7ff", - "0xd0032900", - "0x1c409e00", - "0x1e764346", - "0xd81342b4", - "0x4478480a", - "0x60046800", - "0x20094909", - "0xf7ff71c8", - "0x4607ffbf", - "0x280069a8", - "0x4780d000", - "0xd1032f00", - "0x190468e8", - "0xd9eb42b4", - "0xbdf84638", - "0x27a", - "0x40020000", - "0x4604b510", - "0xf7ff4608", - "0x2800ff9f", - "0x2c00d106", - "0x4904d005", - "0x71c82044", - "0xffa0f7ff", - "0x2004bd10", - "0xbd10", - "0x40020000", - "0xd00c2800", - "0xd00a2a00", - "0xd21a2908", - "0x447b000b", - "0x18db791b", - "0x705449f", - "0xd0b0907", - "0x2004110f", - "0x68c04770", - "0x6840e00a", - "0x6880e008", - "0x6800e006", - "0x2001e004", - "0x6900e002", - "0x6940e000", - "0x20006010", - "0x206a4770", - "0x4770", - "0xd00a2800", - "0x68c9490f", - "0xe094a0f", - "0x447a0049", - "0x3095a51", - "0x2064d103", - "0x20044770", - "0xb4104770", - "0x60032300", - "0x21026041", - "0x2496081", - "0x490760c1", - "0x158a7a0c", - "0x610240a2", - "0x61837ac9", - "0xbc106141", - "0x47704618", - "0x40048040", - "0x1aa", - "0x40020020", - "0xd1012a00", - "0x47702004", - "0x461cb5ff", - "0x4615b081", - "0x2304460e", - "0x98014622", - "0xff19f7ff", - "0xd1190007", - "0xd0162c00", - "0x4478480c", - "0x600e6801", - "0x6800cd02", - "0x490a6041", - "0x71c82006", - "0xff30f7ff", - "0x98014607", - "0x28006980", - "0x4780d000", - "0xd1022f00", - "0x1f241d36", - "0x4638d1e8", - "0xbdf0b005", - "0x162", - "0x40020000", - "0xd0022800", - "0x20006181", - "0x20044770", - "0x4770", - "0xb081b5ff", - "0x460e4614", - "0x23044605", - "0xfee7f7ff", - "0xd12a2800", - "0x686868a9", - "0xfd6ef7ff", - "0x42719000", - "0x40014240", - "0x42b7424f", - "0x9800d101", - "0x2c00183f", - "0x1bbdd01a", - "0xd90042a5", - "0x490d4625", - "0x447908a8", - "0x600e6809", - "0x2201490b", - "0xa0271ca", - "0x728872ca", - "0x72489804", - "0xfeeaf7ff", - "0xd1062800", - "0x1b649800", - "0x183f1976", - "0xd1e42c00", - "0xb0052000", - "0xbdf0", - "0xda", - "0x40020000", - "0xd1012800", - "0x47702004", - "0x4803b510", - "0x71c22240", - "0xf7ff7181", - "0xbd10fecf", - "0x40020000", - "0xd1012b00", - "0x47702004", - "0x461cb5f8", - "0x460e4615", - "0x9f082304", - "0xfe99f7ff", - "0xd1192800", - "0xd0172d00", - "0x447a4a0f", - "0x60066810", - "0x2102480e", - "0x990671c1", - "0x681172c1", - "0x60886820", - "0xfeaef7ff", - "0xd0082800", - "0x29009907", - "0x600ed000", - "0xd0012f00", - "0x60392100", - "0x1f2dbdf8", - "0x1d361d24", - "0xd1e12d00", - "0xbdf8", - "0x62", - "0x40020000", - "0x40002", - "0x80000", - "0x100000", - "0x200000", - "0x400000", - "0x0", - "0x0", - "0x200000", - "0x40020004", - "0x0" - ], - "load_address": "0x20000000", - "min_program_length": "0x4", - "page_buffers": [ - "0x20000a00", - "0x20001200" - ], - "pc_eraseAll": "0x20000209", - "pc_erase_sector": "0x2000023d", - "pc_init": "0x2000027d", - "pc_program_page": "0x2000029d", - "pc_unInit": "0x200002e5", - "static_base": "0x20000648" - }, - "memory_map": [ - { - "blocksize": "0x400", - "end": "0x27fff", - "length": "0x28000", - "name": "flash", - "start": "0x0", - "type": "flash" - }, - { - "blocksize": "0x0", - "end": "0x20003fff", - "length": "0x5000", - "name": "ram", - "start": "0x1ffff000", - "type": "ram" - } - ], - "target_name": "kw40z4" - }, - "0298": { - "flash_algo": { - "analyzer_address": "0x1ffff800", - "analyzer_supported": true, - "begin_data": "0x20000a00", - "begin_stack": "0x20000800", - "instructions": [ - "0xe00abe00", - "0x62d780d", - "0x24084068", - "0xd3000040", - "0x1e644058", - "0x1c49d1fa", - "0x2a001e52", - "0x4770d1f2", - "0x9032200", - "0xd373428b", - "0x428b0a03", - "0xb03d358", - "0xd33c428b", - "0x428b0c03", - "0xe012d321", - "0x430b4603", - "0x2200d47f", - "0x428b0843", - "0x903d374", - "0xd35f428b", - "0x428b0a03", - "0xb03d344", - "0xd328428b", - "0x428b0c03", - "0x22ffd30d", - "0xba120209", - "0x428b0c03", - "0x1212d302", - "0xd0650209", - "0x428b0b03", - "0xe000d319", - "0xbc30a09", - "0xd301428b", - "0x1ac003cb", - "0xb834152", - "0xd301428b", - "0x1ac0038b", - "0xb434152", - "0xd301428b", - "0x1ac0034b", - "0xb034152", - "0xd301428b", - "0x1ac0030b", - "0xac34152", - "0xd301428b", - "0x1ac002cb", - "0xa834152", - "0xd301428b", - "0x1ac0028b", - "0xa434152", - "0xd301428b", - "0x1ac0024b", - "0xa034152", - "0xd301428b", - "0x1ac0020b", - "0xd2cd4152", - "0x428b09c3", - "0x1cbd301", - "0x41521ac0", - "0x428b0983", - "0x18bd301", - "0x41521ac0", - "0x428b0943", - "0x14bd301", - "0x41521ac0", - "0x428b0903", - "0x10bd301", - "0x41521ac0", - "0x428b08c3", - "0xcbd301", - "0x41521ac0", - "0x428b0883", - "0x8bd301", - "0x41521ac0", - "0x428b0843", - "0x4bd301", - "0x41521ac0", - "0xd2001a41", - "0x41524601", - "0x47704610", - "0xfcae05d", - "0x4249d000", - "0xd3001003", - "0x40534240", - "0x469c2200", - "0x428b0903", - "0xa03d32d", - "0xd312428b", - "0x18922fc", - "0xa03ba12", - "0xd30c428b", - "0x11920189", - "0xd308428b", - "0x11920189", - "0xd304428b", - "0xd03a0189", - "0xe0001192", - "0x9c30989", - "0xd301428b", - "0x1ac001cb", - "0x9834152", - "0xd301428b", - "0x1ac0018b", - "0x9434152", - "0xd301428b", - "0x1ac0014b", - "0x9034152", - "0xd301428b", - "0x1ac0010b", - "0x8c34152", - "0xd301428b", - "0x1ac000cb", - "0x8834152", - "0xd301428b", - "0x1ac0008b", - "0xd2d94152", - "0x428b0843", - "0x4bd301", - "0x41521ac0", - "0xd2001a41", - "0x46634601", - "0x105b4152", - "0xd3014610", - "0x2b004240", - "0x4249d500", - "0x46634770", - "0xd300105b", - "0xb5014240", - "0x46c02000", - "0xbd0246c0", - "0xb510480a", - "0x44484908", - "0xf8f6f000", - "0xd1042800", - "0x21004806", - "0xf0004448", - "0x4a05f9bb", - "0x230168d1", - "0x4319029b", - "0xbd1060d1", - "0x6b65666b", - "0x4", - "0xf0003000", - "0x4c0cb570", - "0x444c4605", - "0x4b0b4601", - "0x68e24620", - "0xf89ef000", - "0xd1052800", - "0x46292300", - "0x68e24620", - "0xf960f000", - "0x68ca4905", - "0x29b2301", - "0x60ca431a", - "0xbd70", - "0x4", - "0x6b65666b", - "0xf0003000", - "0x4809b510", - "0x81c14907", - "0x81c14908", - "0x8498801", - "0x80010049", - "0x44484806", - "0xf8ecf000", - "0xd0002800", - "0xbd102001", - "0xc520", - "0x40052000", - "0xd928", - "0x4", - "0x460cb570", - "0x4606460b", - "0x480d4601", - "0x4615b084", - "0xf0004448", - "0x2800f8f5", - "0x9001d10a", - "0x21019002", - "0x91004807", - "0x4622462b", - "0x44484631", - "0xf96af000", - "0x68ca4904", - "0x29b2301", - "0x60ca431a", - "0xbd70b004", - "0x4", - "0xf0003000", - "0x47702000", - "0xd0032800", - "0xd801290f", - "0xd0012a04", - "0x47702004", - "0x47702000", - "0xd1012800", - "0x47702004", - "0x1e5bb410", - "0x421c460c", - "0x421ad101", - "0xbc10d002", - "0x47702065", - "0x428b6803", - "0x6840d804", - "0x18181889", - "0xd2024288", - "0x2066bc10", - "0xbc104770", - "0x47702000", - "0x42884903", - "0x206bd001", - "0x20004770", - "0x4770", - "0x6b65666b", - "0x2170480a", - "0x21807001", - "0x78017001", - "0xd5fc0609", - "0x6817800", - "0x2067d501", - "0x6c14770", - "0x2068d501", - "0x7c04770", - "0x2069d0fc", - "0x4770", - "0x40020000", - "0x4605b5f8", - "0x460c4616", - "0xf7ff4618", - "0x2800ffd7", - "0x2304d12b", - "0x46214632", - "0xf7ff4628", - "0x7ffb3", - "0x19a6d123", - "0x68e91e76", - "0x91004630", - "0xfe32f7ff", - "0xd0032900", - "0x1c409e00", - "0x1e764346", - "0xd81342b4", - "0x4478480a", - "0x60046800", - "0x20094909", - "0xf7ff71c8", - "0x4607ffbf", - "0x280069a8", - "0x4780d000", - "0xd1032f00", - "0x190468e8", - "0xd9eb42b4", - "0xbdf84638", - "0x26a", - "0x40020000", - "0x4604b510", - "0xf7ff4608", - "0x2800ff9f", - "0x2c00d106", - "0x4904d005", - "0x71c82044", - "0xffa0f7ff", - "0x2004bd10", - "0xbd10", - "0x40020000", - "0xd00c2800", - "0xd00a2a00", - "0xd21a2908", - "0x447b000b", - "0x18db791b", - "0x705449f", - "0xd0b0907", - "0x2004110f", - "0x68c04770", - "0x6840e00a", - "0x6880e008", - "0x6800e006", - "0x2000e004", - "0x6900e002", - "0x6940e000", - "0x20006010", - "0x206a4770", - "0x4770", - "0xd0142800", - "0x68c9490c", - "0xe094a0c", - "0x447a0049", - "0x3095a51", - "0x2200d00d", - "0x60416002", - "0x60812101", - "0x61426102", - "0x61820289", - "0x461060c1", - "0x20044770", - "0x20644770", - "0x4770", - "0x40048040", - "0x19a", - "0xd1012a00", - "0x47702004", - "0x461cb5ff", - "0x4615b081", - "0x2304460e", - "0x98014622", - "0xff22f7ff", - "0xd1190007", - "0xd0162c00", - "0x4478480c", - "0x600e6801", - "0x6800cd02", - "0x490a6041", - "0x71c82006", - "0xff38f7ff", - "0x98014607", - "0x28006980", - "0x4780d000", - "0xd1022f00", - "0x1f241d36", - "0x4638d1e8", - "0xbdf0b005", - "0x162", - "0x40020000", - "0xd0022800", - "0x20006181", - "0x20044770", - "0x4770", - "0xb081b5ff", - "0x460e4614", - "0x23044605", - "0xfef0f7ff", - "0xd12a2800", - "0x686868a9", - "0xfd72f7ff", - "0x42719000", - "0x40014240", - "0x42b7424f", - "0x9800d101", - "0x2c00183f", - "0x1bbdd01a", - "0xd90042a5", - "0x490d4625", - "0x447908a8", - "0x600e6809", - "0x2201490b", - "0xa0271ca", - "0x728872ca", - "0x72489804", - "0xfef2f7ff", - "0xd1062800", - "0x1b649800", - "0x183f1976", - "0xd1e42c00", - "0xb0052000", - "0xbdf0", - "0xda", - "0x40020000", - "0xd1012800", - "0x47702004", - "0x4803b510", - "0x71c22240", - "0xf7ff7181", - "0xbd10fed7", - "0x40020000", - "0xd1012b00", - "0x47702004", - "0x461cb5f8", - "0x460e4615", - "0x9f082304", - "0xfea2f7ff", - "0xd1192800", - "0xd0172d00", - "0x447a4a0f", - "0x60066810", - "0x2102480e", - "0x990671c1", - "0x681172c1", - "0x60886820", - "0xfeb6f7ff", - "0xd0082800", - "0x29009907", - "0x600ed000", - "0xd0012f00", - "0x60392100", - "0x1f2dbdf8", - "0x1d361d24", - "0xd1e12d00", - "0xbdf8", - "0x62", - "0x40020000", - "0x40002", - "0x80000", - "0x100000", - "0x200000", - "0x400000", - "0x0", - "0x0", - "0x200000", - "0x40020004", - "0x0" - ], - "load_address": "0x20000000", - "min_program_length": "0x4", - "page_buffers": [ - "0x20000a00", - "0x20001200" - ], - "pc_eraseAll": "0x20000209", - "pc_erase_sector": "0x2000023d", - "pc_init": "0x2000027d", - "pc_program_page": "0x200002b1", - "pc_unInit": "0x200002f9", - "static_base": "0x20000640" - }, - "memory_map": [ - { - "blocksize": "0x400", - "end": "0x7fff", - "length": "0x8000", - "name": "flash", - "start": "0x0", - "type": "flash" - }, - { - "blocksize": "0x0", - "end": "0x200017ff", - "length": "0x2000", - "name": "ram", - "start": "0x1ffff800", - "type": "ram" - } - ], - "target_name": "kv10z7" - }, - "0300": { - "flash_algo": { - "analyzer_address": "0x1ffff800", - "analyzer_supported": true, - "begin_data": "0x20000a00", - "begin_stack": "0x20000800", - "instructions": [ - "0xe00abe00", - "0x62d780d", - "0x24084068", - "0xd3000040", - "0x1e644058", - "0x1c49d1fa", - "0x2a001e52", - "0x4770d1f2", - "0x9032200", - "0xd373428b", - "0x428b0a03", - "0xb03d358", - "0xd33c428b", - "0x428b0c03", - "0xe012d321", - "0x430b4603", - "0x2200d47f", - "0x428b0843", - "0x903d374", - "0xd35f428b", - "0x428b0a03", - "0xb03d344", - "0xd328428b", - "0x428b0c03", - "0x22ffd30d", - "0xba120209", - "0x428b0c03", - "0x1212d302", - "0xd0650209", - "0x428b0b03", - "0xe000d319", - "0xbc30a09", - "0xd301428b", - "0x1ac003cb", - "0xb834152", - "0xd301428b", - "0x1ac0038b", - "0xb434152", - "0xd301428b", - "0x1ac0034b", - "0xb034152", - "0xd301428b", - "0x1ac0030b", - "0xac34152", - "0xd301428b", - "0x1ac002cb", - "0xa834152", - "0xd301428b", - "0x1ac0028b", - "0xa434152", - "0xd301428b", - "0x1ac0024b", - "0xa034152", - "0xd301428b", - "0x1ac0020b", - "0xd2cd4152", - "0x428b09c3", - "0x1cbd301", - "0x41521ac0", - "0x428b0983", - "0x18bd301", - "0x41521ac0", - "0x428b0943", - "0x14bd301", - "0x41521ac0", - "0x428b0903", - "0x10bd301", - "0x41521ac0", - "0x428b08c3", - "0xcbd301", - "0x41521ac0", - "0x428b0883", - "0x8bd301", - "0x41521ac0", - "0x428b0843", - "0x4bd301", - "0x41521ac0", - "0xd2001a41", - "0x41524601", - "0x47704610", - "0xfcae05d", - "0x4249d000", - "0xd3001003", - "0x40534240", - "0x469c2200", - "0x428b0903", - "0xa03d32d", - "0xd312428b", - "0x18922fc", - "0xa03ba12", - "0xd30c428b", - "0x11920189", - "0xd308428b", - "0x11920189", - "0xd304428b", - "0xd03a0189", - "0xe0001192", - "0x9c30989", - "0xd301428b", - "0x1ac001cb", - "0x9834152", - "0xd301428b", - "0x1ac0018b", - "0x9434152", - "0xd301428b", - "0x1ac0014b", - "0x9034152", - "0xd301428b", - "0x1ac0010b", - "0x8c34152", - "0xd301428b", - "0x1ac000cb", - "0x8834152", - "0xd301428b", - "0x1ac0008b", - "0xd2d94152", - "0x428b0843", - "0x4bd301", - "0x41521ac0", - "0xd2001a41", - "0x46634601", - "0x105b4152", - "0xd3014610", - "0x2b004240", - "0x4249d500", - "0x46634770", - "0xd300105b", - "0xb5014240", - "0x46c02000", - "0xbd0246c0", - "0xb510480a", - "0x44484908", - "0xf8fcf000", - "0xd1042800", - "0x21004806", - "0xf0004448", - "0x4a05f9c9", - "0x230168d1", - "0x4319029b", - "0xbd1060d1", - "0x6b65666b", - "0x4", - "0xf0003000", - "0x4c0cb570", - "0x444c4605", - "0x4b0b4601", - "0x68e24620", - "0xf8a4f000", - "0xd1052800", - "0x46292300", - "0x68e24620", - "0xf96ef000", - "0x68ca4905", - "0x29b2301", - "0x60ca431a", - "0xbd70", - "0x4", - "0x6b65666b", - "0xf0003000", - "0x4809b510", - "0x81c14907", - "0x81c14908", - "0x8498801", - "0x80010049", - "0x44484806", - "0xf8f2f000", - "0xd0002800", - "0xbd102001", - "0xc520", - "0x40052000", - "0xd928", - "0x4", - "0x460cb570", - "0x4606460b", - "0x480d4601", - "0x4615b084", - "0xf0004448", - "0x2800f903", - "0x9001d10a", - "0x21019002", - "0x91004807", - "0x4622462b", - "0x44484631", - "0xf978f000", - "0x68ca4904", - "0x29b2301", - "0x60ca431a", - "0xbd70b004", - "0x4", - "0xf0003000", - "0x47702000", - "0xd0082800", - "0xd802290f", - "0xd1042a04", - "0x2913e005", - "0x2a08d801", - "0x2004d001", - "0x20004770", - "0x28004770", - "0x2004d101", - "0xb4104770", - "0x460c1e5b", - "0xd101421c", - "0xd002421a", - "0x2065bc10", - "0x68034770", - "0xd804428b", - "0x18896840", - "0x42881818", - "0xbc10d202", - "0x47702066", - "0x2000bc10", - "0x4770", - "0x42884903", - "0x206bd001", - "0x20004770", - "0x4770", - "0x6b65666b", - "0x2170480a", - "0x21807001", - "0x78017001", - "0xd5fc0609", - "0x6817800", - "0x2067d501", - "0x6c14770", - "0x2068d501", - "0x7c04770", - "0x2069d0fc", - "0x4770", - "0x40020000", - "0x4605b5f8", - "0x460c4616", - "0xf7ff4618", - "0x2800ffd7", - "0x2304d12b", - "0x46214632", - "0xf7ff4628", - "0x7ffb2", - "0x19a6d123", - "0x68e91e76", - "0x91004630", - "0xfe2cf7ff", - "0xd0032900", - "0x1c409e00", - "0x1e764346", - "0xd81342b4", - "0x4478480a", - "0x60046800", - "0x20094909", - "0xf7ff71c8", - "0x4607ffbf", - "0x280069a8", - "0x4780d000", - "0xd1032f00", - "0x190468e8", - "0xd9eb42b4", - "0xbdf84638", - "0x27a", - "0x40020000", - "0x4604b510", - "0xf7ff4608", - "0x2800ff9f", - "0x2c00d106", - "0x4904d005", - "0x71c82044", - "0xffa0f7ff", - "0x2004bd10", - "0xbd10", - "0x40020000", - "0xd00c2800", - "0xd00a2a00", - "0xd21a2908", - "0x447b000b", - "0x18db791b", - "0x705449f", - "0xd0b0907", - "0x2004110f", - "0x68c04770", - "0x6840e00a", - "0x6880e008", - "0x6800e006", - "0x2001e004", - "0x6900e002", - "0x6940e000", - "0x20006010", - "0x206a4770", - "0x4770", - "0xd00a2800", - "0x68c9490f", - "0xe094a0f", - "0x447a0049", - "0x3095a51", - "0x2064d103", - "0x20044770", - "0xb4104770", - "0x60032300", - "0x21016041", - "0x2896081", - "0x490760c1", - "0x158a7a0c", - "0x610240a2", - "0x61837ac9", - "0xbc106141", - "0x47704618", - "0x40048040", - "0x1aa", - "0x40020020", - "0xd1012a00", - "0x47702004", - "0x461cb5ff", - "0x4615b081", - "0x2304460e", - "0x98014622", - "0xff19f7ff", - "0xd1190007", - "0xd0162c00", - "0x4478480c", - "0x600e6801", - "0x6800cd02", - "0x490a6041", - "0x71c82006", - "0xff30f7ff", - "0x98014607", - "0x28006980", - "0x4780d000", - "0xd1022f00", - "0x1f241d36", - "0x4638d1e8", - "0xbdf0b005", - "0x162", - "0x40020000", - "0xd0022800", - "0x20006181", - "0x20044770", - "0x4770", - "0xb081b5ff", - "0x460e4614", - "0x23044605", - "0xfee7f7ff", - "0xd12a2800", - "0x686868a9", - "0xfd64f7ff", - "0x42719000", - "0x40014240", - "0x42b7424f", - "0x9800d101", - "0x2c00183f", - "0x1bbdd01a", - "0xd90042a5", - "0x490d4625", - "0x447908a8", - "0x600e6809", - "0x2201490b", - "0xa0271ca", - "0x728872ca", - "0x72489804", - "0xfeeaf7ff", - "0xd1062800", - "0x1b649800", - "0x183f1976", - "0xd1e42c00", - "0xb0052000", - "0xbdf0", - "0xda", - "0x40020000", - "0xd1012800", - "0x47702004", - "0x4803b510", - "0x71c22240", - "0xf7ff7181", - "0xbd10fecf", - "0x40020000", - "0xd1012b00", - "0x47702004", - "0x461cb5f8", - "0x460e4615", - "0x9f082304", - "0xfe99f7ff", - "0xd1192800", - "0xd0172d00", - "0x447a4a0f", - "0x60066810", - "0x2102480e", - "0x990671c1", - "0x681172c1", - "0x60886820", - "0xfeaef7ff", - "0xd0082800", - "0x29009907", - "0x600ed000", - "0xd0012f00", - "0x60392100", - "0x1f2dbdf8", - "0x1d361d24", - "0xd1e12d00", - "0xbdf8", - "0x62", - "0x40020000", - "0x40002", - "0x80000", - "0x100000", - "0x200000", - "0x400000", - "0x0", - "0x0", - "0x200000", - "0x40020004", - "0x0" - ], - "load_address": "0x20000000", - "min_program_length": "0x4", - "page_buffers": [ - "0x20000a00", - "0x20001200" - ], - "pc_eraseAll": "0x20000209", - "pc_erase_sector": "0x2000023d", - "pc_init": "0x2000027d", - "pc_program_page": "0x200002b1", - "pc_unInit": "0x200002f9", - "static_base": "0x2000065c" - }, - "memory_map": [ - { - "blocksize": "0x400", - "end": "0x1ffff", - "length": "0x20000", - "name": "flash", - "start": "0x0", - "type": "flash" - }, - { - "blocksize": "0x0", - "end": "0x20002fff", - "length": "0x4000", - "name": "ram", - "start": "0x1ffff000", - "type": "ram" - } - ], - "target_name": "kv11z7" - }, - "0311": { - "flash_algo": { - "analyzer_address": "0x1ffff000", - "analyzer_supported": true, - "begin_data": "0x20000a00", - "begin_stack": "0x20000800", - "instructions": [ - "0xe00abe00", - "0x62d780d", - "0x24084068", - "0xd3000040", - "0x1e644058", - "0x1c49d1fa", - "0x2a001e52", - "0x4770d1f2", - "0xb510482e", - "0x5120f24c", - "0xf64d81c1", - "0x81c11128", - "0xf0218801", - "0x80010101", - "0x44484829", - "0xf856f000", - "0xbf182800", - "0xbd102001", - "0x47702000", - "0xb5104824", - "0x44484924", - "0xf926f000", - "0x4821b920", - "0x44482100", - "0xf9daf000", - "0x684a4920", - "0x270f442", - "0xbd10604a", - "0x4c1bb570", - "0x444c4605", - "0x4b1a4601", - "0x68e24620", - "0xf88ef000", - "0x2300b928", - "0x46204629", - "0xf00068e2", - "0x4915f91f", - "0xf442684a", - "0x604a0270", - "0xb570bd70", - "0x460b460c", - "0x46014606", - "0xb084480d", - "0x44484615", - "0xf8b8f000", - "0x2000b958", - "0xe9cd2101", - "0x90021000", - "0x462b4807", - "0x46314622", - "0xf0004448", - "0x4906f963", - "0xf442684a", - "0x604a0270", - "0xbd70b004", - "0x40052000", - "0x4", - "0x6b65666b", - "0x4001f000", - "0xbf042800", - "0x47702004", - "0x6cc94926", - "0xe094a26", - "0xf832447a", - "0x3091011", - "0x2064bf04", - "0x22004770", - "0x2100e9c0", - "0x60812104", - "0x60c10289", - "0x780b491f", - "0x7c80f44f", - "0xf303fa0c", - "0x78c96103", - "0x1205e9c0", - "0x47704610", - "0xbf0e2800", - "0x61812004", - "0x47702000", - "0xbf042800", - "0x47702004", - "0x42191e5b", - "0x421abf0e", - "0x47702065", - "0x428b6803", - "0x6840d806", - "0x44184411", - "0xbf244288", - "0x47702000", - "0x47702066", - "0x4288490c", - "0x206bbf14", - "0x47702000", - "0x290fb140", - "0x2a04d802", - "0xe005d104", - "0xbf982913", - "0xd0012a08", - "0x47702004", - "0x47702000", - "0x40048000", - "0x36c", - "0x40020028", - "0x6b65666b", - "0x4df0e92d", - "0x46154606", - "0x4618460c", - "0xffdcf7ff", - "0xbf182800", - "0x8df0e8bd", - "0x462a2310", - "0x46304621", - "0xffbcf7ff", - "0xbf180007", - "0x8df0e8bd", - "0x1e451960", - "0xfbb568f0", - "0xfb00f1f0", - "0xb1125211", - "0x43481c49", - "0x42ac1e45", - "0xf8dfd817", - "0x44f88034", - "0xb030f8df", - "0xa09f04f", - "0xf8d8", - "0xf88b6004", - "0xf000a007", - "0x4607f917", - "0x280069b0", - "0x4780bf18", - "0x68f0b91f", - "0x42ac4404", - "0x4638d9ee", - "0x8df0e8bd", - "0x27a", - "0x40020000", - "0xbf042a00", - "0x47702004", - "0x4df0e92d", - "0x4614461d", - "0x4607460e", - "0x462a2308", - "0xff7ef7ff", - "0xb00ea5f", - "0xe8bdbf18", - "0x2d008df0", - "0xf8dfbf1e", - "0x44f8804c", - "0xa07f04f", - "0xf8d8d01c", - "0x60060000", - "0x1000f8d8", - "0xb04f854", - "0xf8d86048", - "0xf8541000", - "0x60880b04", - "0xf880480a", - "0xf000a007", - "0x4683f8d9", - "0x280069b8", - "0x4780bf18", - "0xf00f1bb", - "0x3608d102", - "0xd1e23d08", - "0xe8bd4658", - "0x8df0", - "0x212", - "0x40020000", - "0x4604b510", - "0xf7ff4608", - "0x2800ff5d", - "0xbd10bf18", - "0xbf042c00", - "0xbd102004", - "0x49032044", - "0xe8bd71c8", - "0xf0004010", - "0xb8b3", - "0x40020000", - "0x4df0e92d", - "0x4614469a", - "0x4605460e", - "0xf7ff2310", - "0x2800ff2d", - "0xe8bdbf18", - "0xe9d58df0", - "0xfbb00101", - "0x4270f8f1", - "0x100f1c8", - "0x42474008", - "0xbf0842b7", - "0x2c004447", - "0xf8dfbf18", - "0xd01cb044", - "0x42a51bbd", - "0x4625bf88", - "0x490e0928", - "0x68094479", - "0x2101600e", - "0x1007f88b", - "0xf88b0a01", - "0xf88b100b", - "0xf88b000a", - "0xf000a009", - "0x2800f87d", - "0xe8bdbf18", - "0x1b648df0", - "0x4447442e", - "0x2000d1e2", - "0x8df0e8bd", - "0x40020000", - "0x14c", - "0xbf122800", - "0x20042a00", - "0x29084770", - "0xe8dfd215", - "0x604f001", - "0xc0a0806", - "0x68c0100e", - "0x6840e00a", - "0x6880e008", - "0x6800e006", - "0x2001e004", - "0x6900e002", - "0x6940e000", - "0x20006010", - "0x206a4770", - "0x4770", - "0xbf042b00", - "0x47702004", - "0x4df0e92d", - "0xe9dd461c", - "0x46158709", - "0x2304460e", - "0xa020f8dd", - "0xfec4f7ff", - "0xbf182800", - "0x8df0e8bd", - "0xbf1a2d00", - "0xb04cf8df", - "0xe8bd44fb", - "0xf8db8df0", - "0x60060000", - "0x21024810", - "0xf88071c1", - "0xf8dba00b", - "0x68201000", - "0xf0006088", - "0xb150f825", - "0xf00f1b8", - "0xf8c8bf18", - "0x2f006000", - "0x2100bf1c", - "0xe8bd6039", - "0x1f2d8df0", - "0x404f104", - "0x604f106", - "0xe8bdd1df", - "0x8df0", - "0xa0", - "0x40020000", - "0xbf042800", - "0x47702004", - "0x48022240", - "0x718171c2", - "0xb802f000", - "0x40020000", - "0x2170480c", - "0x21807001", - "0x78017001", - "0xf80f011", - "0x7800d0fb", - "0xf20f010", - "0x2067bf1c", - "0xf0104770", - "0xbf1c0f10", - "0x47702068", - "0x1f010", - "0x2069bf18", - "0x4770", - "0x40020000", - "0x40020004", - "0x0", - "0x80000", - "0x100000", - "0x200000", - "0x400000", - "0x800000", - "0x1000000", - "0x2000000", - "0x0" - ], - "load_address": "0x20000000", - "min_program_length": "0x8", - "page_buffers": [ - "0x20003000", - "0x20004000" - ], - "pc_eraseAll": "0x2000004d", - "pc_erase_sector": "0x20000071", - "pc_init": "0x20000021", - "pc_program_page": "0x2000009f", - "pc_unInit": "0x20000049", - "static_base": "0x2000048c" - }, - "memory_map": [ - { - "blocksize": "0x1000", - "end": "0x1fffff", - "length": "0x200000", - "name": "flash", - "start": "0x0", - "type": "flash" - }, - { - "blocksize": "0x0", - "end": "0x14000fff", - "length": "0x1000", - "name": "ram", - "start": "0x14000000", - "type": "ram" - }, - { - "blocksize": "0x0", - "end": "0x2002ffff", - "length": "0x40000", - "name": "ram", - "start": "0x1fff0000", - "type": "ram" - } - ], - "target_name": "k66f18" - }, - "0320": { - "flash_algo": { - "analyzer_address": "0x1ffff800", - "analyzer_supported": true, - "begin_data": "0x20000a00", - "begin_stack": "0x20000800", - "instructions": [ - "0xe00abe00", - "0x62d780d", - "0x24084068", - "0xd3000040", - "0x1e644058", - "0x1c49d1fa", - "0x2a001e52", - "0x4770d1f2", - "0x9032200", - "0xd373428b", - "0x428b0a03", - "0xb03d358", - "0xd33c428b", - "0x428b0c03", - "0xe012d321", - "0x430b4603", - "0x2200d47f", - "0x428b0843", - "0x903d374", - "0xd35f428b", - "0x428b0a03", - "0xb03d344", - "0xd328428b", - "0x428b0c03", - "0x22ffd30d", - "0xba120209", - "0x428b0c03", - "0x1212d302", - "0xd0650209", - "0x428b0b03", - "0xe000d319", - "0xbc30a09", - "0xd301428b", - "0x1ac003cb", - "0xb834152", - "0xd301428b", - "0x1ac0038b", - "0xb434152", - "0xd301428b", - "0x1ac0034b", - "0xb034152", - "0xd301428b", - "0x1ac0030b", - "0xac34152", - "0xd301428b", - "0x1ac002cb", - "0xa834152", - "0xd301428b", - "0x1ac0028b", - "0xa434152", - "0xd301428b", - "0x1ac0024b", - "0xa034152", - "0xd301428b", - "0x1ac0020b", - "0xd2cd4152", - "0x428b09c3", - "0x1cbd301", - "0x41521ac0", - "0x428b0983", - "0x18bd301", - "0x41521ac0", - "0x428b0943", - "0x14bd301", - "0x41521ac0", - "0x428b0903", - "0x10bd301", - "0x41521ac0", - "0x428b08c3", - "0xcbd301", - "0x41521ac0", - "0x428b0883", - "0x8bd301", - "0x41521ac0", - "0x428b0843", - "0x4bd301", - "0x41521ac0", - "0xd2001a41", - "0x41524601", - "0x47704610", - "0xfcae05d", - "0x4249d000", - "0xd3001003", - "0x40534240", - "0x469c2200", - "0x428b0903", - "0xa03d32d", - "0xd312428b", - "0x18922fc", - "0xa03ba12", - "0xd30c428b", - "0x11920189", - "0xd308428b", - "0x11920189", - "0xd304428b", - "0xd03a0189", - "0xe0001192", - "0x9c30989", - "0xd301428b", - "0x1ac001cb", - "0x9834152", - "0xd301428b", - "0x1ac0018b", - "0x9434152", - "0xd301428b", - "0x1ac0014b", - "0x9034152", - "0xd301428b", - "0x1ac0010b", - "0x8c34152", - "0xd301428b", - "0x1ac000cb", - "0x8834152", - "0xd301428b", - "0x1ac0008b", - "0xd2d94152", - "0x428b0843", - "0x4bd301", - "0x41521ac0", - "0xd2001a41", - "0x46634601", - "0x105b4152", - "0xd3014610", - "0x2b004240", - "0x4249d500", - "0x46634770", - "0xd300105b", - "0xb5014240", - "0x46c02000", - "0xbd0246c0", - "0xb510480a", - "0x44484908", - "0xf8ecf000", - "0xd1042800", - "0x21004806", - "0xf0004448", - "0x4a05f9b1", - "0x230168d1", - "0x4319029b", - "0xbd1060d1", - "0x6b65666b", - "0x4", - "0xf0003000", - "0x4c0cb570", - "0x444c4605", - "0x4b0b4601", - "0x68e24620", - "0xf894f000", - "0xd1052800", - "0x46292300", - "0x68e24620", - "0xf956f000", - "0x68ca4905", - "0x29b2301", - "0x60ca431a", - "0xbd70", - "0x4", - "0x6b65666b", - "0xf0003000", - "0x4905b510", - "0x60082000", - "0x44484804", - "0xf8e8f000", - "0xd0002800", - "0xbd102001", - "0x40048100", - "0x4", - "0x460cb570", - "0x4606460b", - "0x480d4601", - "0x4615b084", - "0xf0004448", - "0x2800f8f5", - "0x9001d10a", - "0x21019002", - "0x91004807", - "0x4622462b", - "0x44484631", - "0xf96af000", - "0x68ca4904", - "0x29b2301", - "0x60ca431a", - "0xbd70b004", - "0x4", - "0xf0003000", - "0x47702000", - "0xd0032800", - "0xd801290f", - "0xd0012a04", - "0x47702004", - "0x47702000", - "0xd1012800", - "0x47702004", - "0x1e5bb410", - "0x421c460c", - "0x421ad101", - "0xbc10d002", - "0x47702065", - "0x428b6803", - "0x6840d804", - "0x18181889", - "0xd2024288", - "0x2066bc10", - "0xbc104770", - "0x47702000", - "0x42884903", - "0x206bd001", - "0x20004770", - "0x4770", - "0x6b65666b", - "0x2170480a", - "0x21807001", - "0x78017001", - "0xd5fc0609", - "0x6817800", - "0x2067d501", - "0x6c14770", - "0x2068d501", - "0x7c04770", - "0x2069d0fc", - "0x4770", - "0x40020000", - "0x4605b5f8", - "0x460c4616", - "0xf7ff4618", - "0x2800ffd7", - "0x2304d12b", - "0x46214632", - "0xf7ff4628", - "0x7ffb3", - "0x19a6d123", - "0x68e91e76", - "0x91004630", - "0xfe3cf7ff", - "0xd0032900", - "0x1c409e00", - "0x1e764346", - "0xd81342b4", - "0x4478480a", - "0x60046800", - "0x20094909", - "0xf7ff71c8", - "0x4607ffbf", - "0x280069a8", - "0x4780d000", - "0xd1032f00", - "0x190468e8", - "0xd9eb42b4", - "0xbdf84638", - "0x26a", - "0x40020000", - "0x4604b510", - "0xf7ff4608", - "0x2800ff9f", - "0x2c00d106", - "0x4904d005", - "0x71c82044", - "0xffa0f7ff", - "0x2004bd10", - "0xbd10", - "0x40020000", - "0xd00c2800", - "0xd00a2a00", - "0xd21a2908", - "0x447b000b", - "0x18db791b", - "0x705449f", - "0xd0b0907", - "0x2004110f", - "0x68c04770", - "0x6840e00a", - "0x6880e008", - "0x6800e006", - "0x2000e004", - "0x6900e002", - "0x6940e000", - "0x20006010", - "0x206a4770", - "0x4770", - "0xd0142800", - "0x68c9490c", - "0xe094a0c", - "0x447a0049", - "0x3095a51", - "0x2200d00d", - "0x60416002", - "0x60812102", - "0x61426102", - "0x61820249", - "0x461060c1", - "0x20044770", - "0x20644770", - "0x4770", - "0x40048040", - "0x19a", - "0xd1012a00", - "0x47702004", - "0x461cb5ff", - "0x4615b081", - "0x2304460e", - "0x98014622", - "0xff22f7ff", - "0xd1190007", - "0xd0162c00", - "0x4478480c", - "0x600e6801", - "0x6800cd02", - "0x490a6041", - "0x71c82006", - "0xff38f7ff", - "0x98014607", - "0x28006980", - "0x4780d000", - "0xd1022f00", - "0x1f241d36", - "0x4638d1e8", - "0xbdf0b005", - "0x162", - "0x40020000", - "0xd0022800", - "0x20006181", - "0x20044770", - "0x4770", - "0xb081b5ff", - "0x460e4614", - "0x23044605", - "0xfef0f7ff", - "0xd12a2800", - "0x686868a9", - "0xfd7cf7ff", - "0x42719000", - "0x40014240", - "0x42b7424f", - "0x9800d101", - "0x2c00183f", - "0x1bbdd01a", - "0xd90042a5", - "0x490d4625", - "0x447908a8", - "0x600e6809", - "0x2201490b", - "0xa0271ca", - "0x728872ca", - "0x72489804", - "0xfef2f7ff", - "0xd1062800", - "0x1b649800", - "0x183f1976", - "0xd1e42c00", - "0xb0052000", - "0xbdf0", - "0xda", - "0x40020000", - "0xd1012800", - "0x47702004", - "0x4803b510", - "0x71c22240", - "0xf7ff7181", - "0xbd10fed7", - "0x40020000", - "0xd1012b00", - "0x47702004", - "0x461cb5f8", - "0x460e4615", - "0x9f082304", - "0xfea2f7ff", - "0xd1192800", - "0xd0172d00", - "0x447a4a0f", - "0x60066810", - "0x2102480e", - "0x990671c1", - "0x681172c1", - "0x60886820", - "0xfeb6f7ff", - "0xd0082800", - "0x29009907", - "0x600ed000", - "0xd0012f00", - "0x60392100", - "0x1f2dbdf8", - "0x1d361d24", - "0xd1e12d00", - "0xbdf8", - "0x62", - "0x40020000", - "0x40002", - "0x80000", - "0x100000", - "0x200000", - "0x400000", - "0x0", - "0x0", - "0x200000", - "0x40020004", - "0x0" - ], - "load_address": "0x20000000", - "min_program_length": "0x4", - "page_buffers": [ - "0x20000a00", - "0x20001200" - ], - "pc_eraseAll": "0x20000209", - "pc_erase_sector": "0x2000023d", - "pc_init": "0x2000027d", - "pc_program_page": "0x2000029d", - "pc_unInit": "0x200002e5", - "static_base": "0x2000062c" - }, - "memory_map": [ - { - "blocksize": "0x400", - "end": "0x1ffff", - "length": "0x20000", - "name": "flash", - "start": "0x0", - "type": "flash" - }, - { - "blocksize": "0x0", - "end": "0x20002fff", - "length": "0x4000", - "name": "ram", - "start": "0x1ffff000", - "type": "ram" - } - ], - "target_name": "kw01z4" - }, - "0321": { - "flash_algo": { - "analyzer_address": "0x1ffff800", - "analyzer_supported": true, - "begin_data": "0x20000a00", - "begin_stack": "0x20000800", - "instructions": [ - "0xe00abe00", - "0x62d780d", - "0x24084068", - "0xd3000040", - "0x1e644058", - "0x1c49d1fa", - "0x2a001e52", - "0x4770d1f2", - "0x9032200", - "0xd373428b", - "0x428b0a03", - "0xb03d358", - "0xd33c428b", - "0x428b0c03", - "0xe012d321", - "0x430b4603", - "0x2200d47f", - "0x428b0843", - "0x903d374", - "0xd35f428b", - "0x428b0a03", - "0xb03d344", - "0xd328428b", - "0x428b0c03", - "0x22ffd30d", - "0xba120209", - "0x428b0c03", - "0x1212d302", - "0xd0650209", - "0x428b0b03", - "0xe000d319", - "0xbc30a09", - "0xd301428b", - "0x1ac003cb", - "0xb834152", - "0xd301428b", - "0x1ac0038b", - "0xb434152", - "0xd301428b", - "0x1ac0034b", - "0xb034152", - "0xd301428b", - "0x1ac0030b", - "0xac34152", - "0xd301428b", - "0x1ac002cb", - "0xa834152", - "0xd301428b", - "0x1ac0028b", - "0xa434152", - "0xd301428b", - "0x1ac0024b", - "0xa034152", - "0xd301428b", - "0x1ac0020b", - "0xd2cd4152", - "0x428b09c3", - "0x1cbd301", - "0x41521ac0", - "0x428b0983", - "0x18bd301", - "0x41521ac0", - "0x428b0943", - "0x14bd301", - "0x41521ac0", - "0x428b0903", - "0x10bd301", - "0x41521ac0", - "0x428b08c3", - "0xcbd301", - "0x41521ac0", - "0x428b0883", - "0x8bd301", - "0x41521ac0", - "0x428b0843", - "0x4bd301", - "0x41521ac0", - "0xd2001a41", - "0x41524601", - "0x47704610", - "0xfcae05d", - "0x4249d000", - "0xd3001003", - "0x40534240", - "0x469c2200", - "0x428b0903", - "0xa03d32d", - "0xd312428b", - "0x18922fc", - "0xa03ba12", - "0xd30c428b", - "0x11920189", - "0xd308428b", - "0x11920189", - "0xd304428b", - "0xd03a0189", - "0xe0001192", - "0x9c30989", - "0xd301428b", - "0x1ac001cb", - "0x9834152", - "0xd301428b", - "0x1ac0018b", - "0x9434152", - "0xd301428b", - "0x1ac0014b", - "0x9034152", - "0xd301428b", - "0x1ac0010b", - "0x8c34152", - "0xd301428b", - "0x1ac000cb", - "0x8834152", - "0xd301428b", - "0x1ac0008b", - "0xd2d94152", - "0x428b0843", - "0x4bd301", - "0x41521ac0", - "0xd2001a41", - "0x46634601", - "0x105b4152", - "0xd3014610", - "0x2b004240", - "0x4249d500", - "0x46634770", - "0xd300105b", - "0xb5014240", - "0x46c02000", - "0xbd0246c0", - "0xb510480a", - "0x44484908", - "0xf8ecf000", - "0xd1042800", - "0x21004806", - "0xf0004448", - "0x4a05f9b1", - "0x230168d1", - "0x4319029b", - "0xbd1060d1", - "0x6b65666b", - "0x4", - "0xf0003000", - "0x4c0cb570", - "0x444c4605", - "0x4b0b4601", - "0x68e24620", - "0xf894f000", - "0xd1052800", - "0x46292300", - "0x68e24620", - "0xf956f000", - "0x68ca4905", - "0x29b2301", - "0x60ca431a", - "0xbd70", - "0x4", - "0x6b65666b", - "0xf0003000", - "0x4905b510", - "0x60082000", - "0x44484804", - "0xf8e8f000", - "0xd0002800", - "0xbd102001", - "0x40048100", - "0x4", - "0x460cb570", - "0x4606460b", - "0x480d4601", - "0x4615b084", - "0xf0004448", - "0x2800f8f5", - "0x9001d10a", - "0x21019002", - "0x91004807", - "0x4622462b", - "0x44484631", - "0xf96af000", - "0x68ca4904", - "0x29b2301", - "0x60ca431a", - "0xbd70b004", - "0x4", - "0xf0003000", - "0x47702000", - "0xd0032800", - "0xd801290f", - "0xd0012a04", - "0x47702004", - "0x47702000", - "0xd1012800", - "0x47702004", - "0x1e5bb410", - "0x421c460c", - "0x421ad101", - "0xbc10d002", - "0x47702065", - "0x428b6803", - "0x6840d804", - "0x18181889", - "0xd2024288", - "0x2066bc10", - "0xbc104770", - "0x47702000", - "0x42884903", - "0x206bd001", - "0x20004770", - "0x4770", - "0x6b65666b", - "0x2170480a", - "0x21807001", - "0x78017001", - "0xd5fc0609", - "0x6817800", - "0x2067d501", - "0x6c14770", - "0x2068d501", - "0x7c04770", - "0x2069d0fc", - "0x4770", - "0x40020000", - "0x4605b5f8", - "0x460c4616", - "0xf7ff4618", - "0x2800ffd7", - "0x2304d12b", - "0x46214632", - "0xf7ff4628", - "0x7ffb3", - "0x19a6d123", - "0x68e91e76", - "0x91004630", - "0xfe3cf7ff", - "0xd0032900", - "0x1c409e00", - "0x1e764346", - "0xd81342b4", - "0x4478480a", - "0x60046800", - "0x20094909", - "0xf7ff71c8", - "0x4607ffbf", - "0x280069a8", - "0x4780d000", - "0xd1032f00", - "0x190468e8", - "0xd9eb42b4", - "0xbdf84638", - "0x26a", - "0x40020000", - "0x4604b510", - "0xf7ff4608", - "0x2800ff9f", - "0x2c00d106", - "0x4904d005", - "0x71c82044", - "0xffa0f7ff", - "0x2004bd10", - "0xbd10", - "0x40020000", - "0xd00c2800", - "0xd00a2a00", - "0xd21a2908", - "0x447b000b", - "0x18db791b", - "0x705449f", - "0xd0b0907", - "0x2004110f", - "0x68c04770", - "0x6840e00a", - "0x6880e008", - "0x6800e006", - "0x2000e004", - "0x6900e002", - "0x6940e000", - "0x20006010", - "0x206a4770", - "0x4770", - "0xd0142800", - "0x68c9490c", - "0xe094a0c", - "0x447a0049", - "0x3095a51", - "0x2200d00d", - "0x60416002", - "0x60812102", - "0x61426102", - "0x61820249", - "0x461060c1", - "0x20044770", - "0x20644770", - "0x4770", - "0x40048040", - "0x19a", - "0xd1012a00", - "0x47702004", - "0x461cb5ff", - "0x4615b081", - "0x2304460e", - "0x98014622", - "0xff22f7ff", - "0xd1190007", - "0xd0162c00", - "0x4478480c", - "0x600e6801", - "0x6800cd02", - "0x490a6041", - "0x71c82006", - "0xff38f7ff", - "0x98014607", - "0x28006980", - "0x4780d000", - "0xd1022f00", - "0x1f241d36", - "0x4638d1e8", - "0xbdf0b005", - "0x162", - "0x40020000", - "0xd0022800", - "0x20006181", - "0x20044770", - "0x4770", - "0xb081b5ff", - "0x460e4614", - "0x23044605", - "0xfef0f7ff", - "0xd12a2800", - "0x686868a9", - "0xfd7cf7ff", - "0x42719000", - "0x40014240", - "0x42b7424f", - "0x9800d101", - "0x2c00183f", - "0x1bbdd01a", - "0xd90042a5", - "0x490d4625", - "0x447908a8", - "0x600e6809", - "0x2201490b", - "0xa0271ca", - "0x728872ca", - "0x72489804", - "0xfef2f7ff", - "0xd1062800", - "0x1b649800", - "0x183f1976", - "0xd1e42c00", - "0xb0052000", - "0xbdf0", - "0xda", - "0x40020000", - "0xd1012800", - "0x47702004", - "0x4803b510", - "0x71c22240", - "0xf7ff7181", - "0xbd10fed7", - "0x40020000", - "0xd1012b00", - "0x47702004", - "0x461cb5f8", - "0x460e4615", - "0x9f082304", - "0xfea2f7ff", - "0xd1192800", - "0xd0172d00", - "0x447a4a0f", - "0x60066810", - "0x2102480e", - "0x990671c1", - "0x681172c1", - "0x60886820", - "0xfeb6f7ff", - "0xd0082800", - "0x29009907", - "0x600ed000", - "0xd0012f00", - "0x60392100", - "0x1f2dbdf8", - "0x1d361d24", - "0xd1e12d00", - "0xbdf8", - "0x62", - "0x40020000", - "0x40002", - "0x80000", - "0x100000", - "0x200000", - "0x400000", - "0x0", - "0x0", - "0x200000", - "0x40020004", - "0x0" - ], - "load_address": "0x20000000", - "min_program_length": "0x4", - "page_buffers": [ - "0x20000a00", - "0x20001200" - ], - "pc_eraseAll": "0x20000209", - "pc_erase_sector": "0x2000023d", - "pc_init": "0x2000027d", - "pc_program_page": "0x2000029d", - "pc_unInit": "0x200002e5", - "static_base": "0x2000062c" - }, - "memory_map": [ - { - "blocksize": "0x400", - "end": "0x1ffff", - "length": "0x20000", - "name": "flash", - "start": "0x0", - "type": "flash" - }, - { - "blocksize": "0x0", - "end": "0x20002fff", - "length": "0x4000", - "name": "ram", - "start": "0x1ffff000", - "type": "ram" - } - ], - "target_name": "kw01z4" - }, - "0324": { - "flash_algo": { - "analyzer_address": "0x1ffff800", - "analyzer_supported": true, - "begin_data": "0x20000a00", - "begin_stack": "0x20000800", - "instructions": [ - "0xe00abe00", - "0x62d780d", - "0x24084068", - "0xd3000040", - "0x1e644058", - "0x1c49d1fa", - "0x2a001e52", - "0x4770d1f2", - "0x9032200", - "0xd373428b", - "0x428b0a03", - "0xb03d358", - "0xd33c428b", - "0x428b0c03", - "0xe012d321", - "0x430b4603", - "0x2200d47f", - "0x428b0843", - "0x903d374", - "0xd35f428b", - "0x428b0a03", - "0xb03d344", - "0xd328428b", - "0x428b0c03", - "0x22ffd30d", - "0xba120209", - "0x428b0c03", - "0x1212d302", - "0xd0650209", - "0x428b0b03", - "0xe000d319", - "0xbc30a09", - "0xd301428b", - "0x1ac003cb", - "0xb834152", - "0xd301428b", - "0x1ac0038b", - "0xb434152", - "0xd301428b", - "0x1ac0034b", - "0xb034152", - "0xd301428b", - "0x1ac0030b", - "0xac34152", - "0xd301428b", - "0x1ac002cb", - "0xa834152", - "0xd301428b", - "0x1ac0028b", - "0xa434152", - "0xd301428b", - "0x1ac0024b", - "0xa034152", - "0xd301428b", - "0x1ac0020b", - "0xd2cd4152", - "0x428b09c3", - "0x1cbd301", - "0x41521ac0", - "0x428b0983", - "0x18bd301", - "0x41521ac0", - "0x428b0943", - "0x14bd301", - "0x41521ac0", - "0x428b0903", - "0x10bd301", - "0x41521ac0", - "0x428b08c3", - "0xcbd301", - "0x41521ac0", - "0x428b0883", - "0x8bd301", - "0x41521ac0", - "0x428b0843", - "0x4bd301", - "0x41521ac0", - "0xd2001a41", - "0x41524601", - "0x47704610", - "0xfcae05d", - "0x4249d000", - "0xd3001003", - "0x40534240", - "0x469c2200", - "0x428b0903", - "0xa03d32d", - "0xd312428b", - "0x18922fc", - "0xa03ba12", - "0xd30c428b", - "0x11920189", - "0xd308428b", - "0x11920189", - "0xd304428b", - "0xd03a0189", - "0xe0001192", - "0x9c30989", - "0xd301428b", - "0x1ac001cb", - "0x9834152", - "0xd301428b", - "0x1ac0018b", - "0x9434152", - "0xd301428b", - "0x1ac0014b", - "0x9034152", - "0xd301428b", - "0x1ac0010b", - "0x8c34152", - "0xd301428b", - "0x1ac000cb", - "0x8834152", - "0xd301428b", - "0x1ac0008b", - "0xd2d94152", - "0x428b0843", - "0x4bd301", - "0x41521ac0", - "0xd2001a41", - "0x46634601", - "0x105b4152", - "0xd3014610", - "0x2b004240", - "0x4249d500", - "0x46634770", - "0xd300105b", - "0xb5014240", - "0x46c02000", - "0xbd0246c0", - "0xb510480a", - "0x44484908", - "0xf8f2f000", - "0xd1042800", - "0x21004806", - "0xf0004448", - "0x4a05f9bf", - "0x230168d1", - "0x4319029b", - "0xbd1060d1", - "0x6b65666b", - "0x4", - "0xf0003000", - "0x4c0cb570", - "0x444c4605", - "0x4b0b4601", - "0x68e24620", - "0xf89af000", - "0xd1052800", - "0x46292300", - "0x68e24620", - "0xf964f000", - "0x68ca4905", - "0x29b2301", - "0x60ca431a", - "0xbd70", - "0x4", - "0x6b65666b", - "0xf0003000", - "0x4905b510", - "0x60082000", - "0x44484804", - "0xf8eef000", - "0xd0002800", - "0xbd102001", - "0x40048100", - "0x4", - "0x460cb570", - "0x4606460b", - "0x480d4601", - "0x4615b084", - "0xf0004448", - "0x2800f903", - "0x9001d10a", - "0x21019002", - "0x91004807", - "0x4622462b", - "0x44484631", - "0xf978f000", - "0x68ca4904", - "0x29b2301", - "0x60ca431a", - "0xbd70b004", - "0x4", - "0xf0003000", - "0x47702000", - "0xd0082800", - "0xd802290f", - "0xd1042a04", - "0x2913e005", - "0x2a08d801", - "0x2004d001", - "0x20004770", - "0x28004770", - "0x2004d101", - "0xb4104770", - "0x460c1e5b", - "0xd101421c", - "0xd002421a", - "0x2065bc10", - "0x68034770", - "0xd804428b", - "0x18896840", - "0x42881818", - "0xbc10d202", - "0x47702066", - "0x2000bc10", - "0x4770", - "0x42884903", - "0x206bd001", - "0x20004770", - "0x4770", - "0x6b65666b", - "0x2170480a", - "0x21807001", - "0x78017001", - "0xd5fc0609", - "0x6817800", - "0x2067d501", - "0x6c14770", - "0x2068d501", - "0x7c04770", - "0x2069d0fc", - "0x4770", - "0x40020000", - "0x4605b5f8", - "0x460c4616", - "0xf7ff4618", - "0x2800ffd7", - "0x2304d12b", - "0x46214632", - "0xf7ff4628", - "0x7ffb2", - "0x19a6d123", - "0x68e91e76", - "0x91004630", - "0xfe36f7ff", - "0xd0032900", - "0x1c409e00", - "0x1e764346", - "0xd81342b4", - "0x4478480a", - "0x60046800", - "0x20094909", - "0xf7ff71c8", - "0x4607ffbf", - "0x280069a8", - "0x4780d000", - "0xd1032f00", - "0x190468e8", - "0xd9eb42b4", - "0xbdf84638", - "0x27a", - "0x40020000", - "0x4604b510", - "0xf7ff4608", - "0x2800ff9f", - "0x2c00d106", - "0x4904d005", - "0x71c82044", - "0xffa0f7ff", - "0x2004bd10", - "0xbd10", - "0x40020000", - "0xd00c2800", - "0xd00a2a00", - "0xd21a2908", - "0x447b000b", - "0x18db791b", - "0x705449f", - "0xd0b0907", - "0x2004110f", - "0x68c04770", - "0x6840e00a", - "0x6880e008", - "0x6800e006", - "0x2001e004", - "0x6900e002", - "0x6940e000", - "0x20006010", - "0x206a4770", - "0x4770", - "0xd00a2800", - "0x68c9490f", - "0xe094a0f", - "0x447a0049", - "0x3095a51", - "0x2064d103", - "0x20044770", - "0xb4104770", - "0x60032300", - "0x21026041", - "0x2496081", - "0x490760c1", - "0x158a7a0c", - "0x610240a2", - "0x61837ac9", - "0xbc106141", - "0x47704618", - "0x40048040", - "0x1aa", - "0x40020020", - "0xd1012a00", - "0x47702004", - "0x461cb5ff", - "0x4615b081", - "0x2304460e", - "0x98014622", - "0xff19f7ff", - "0xd1190007", - "0xd0162c00", - "0x4478480c", - "0x600e6801", - "0x6800cd02", - "0x490a6041", - "0x71c82006", - "0xff30f7ff", - "0x98014607", - "0x28006980", - "0x4780d000", - "0xd1022f00", - "0x1f241d36", - "0x4638d1e8", - "0xbdf0b005", - "0x162", - "0x40020000", - "0xd0022800", - "0x20006181", - "0x20044770", - "0x4770", - "0xb081b5ff", - "0x460e4614", - "0x23044605", - "0xfee7f7ff", - "0xd12a2800", - "0x686868a9", - "0xfd6ef7ff", - "0x42719000", - "0x40014240", - "0x42b7424f", - "0x9800d101", - "0x2c00183f", - "0x1bbdd01a", - "0xd90042a5", - "0x490d4625", - "0x447908a8", - "0x600e6809", - "0x2201490b", - "0xa0271ca", - "0x728872ca", - "0x72489804", - "0xfeeaf7ff", - "0xd1062800", - "0x1b649800", - "0x183f1976", - "0xd1e42c00", - "0xb0052000", - "0xbdf0", - "0xda", - "0x40020000", - "0xd1012800", - "0x47702004", - "0x4803b510", - "0x71c22240", - "0xf7ff7181", - "0xbd10fecf", - "0x40020000", - "0xd1012b00", - "0x47702004", - "0x461cb5f8", - "0x460e4615", - "0x9f082304", - "0xfe99f7ff", - "0xd1192800", - "0xd0172d00", - "0x447a4a0f", - "0x60066810", - "0x2102480e", - "0x990671c1", - "0x681172c1", - "0x60886820", - "0xfeaef7ff", - "0xd0082800", - "0x29009907", - "0x600ed000", - "0xd0012f00", - "0x60392100", - "0x1f2dbdf8", - "0x1d361d24", - "0xd1e12d00", - "0xbdf8", - "0x62", - "0x40020000", - "0x40002", - "0x80000", - "0x100000", - "0x200000", - "0x400000", - "0x0", - "0x0", - "0x200000", - "0x40020004", - "0x0" - ], - "load_address": "0x20000000", - "min_program_length": "0x4", - "page_buffers": [ - "0x20000a00", - "0x20001200" - ], - "pc_eraseAll": "0x20000209", - "pc_erase_sector": "0x2000023d", - "pc_init": "0x2000027d", - "pc_program_page": "0x2000029d", - "pc_unInit": "0x200002e5", - "static_base": "0x20000648" - }, - "memory_map": [ - { - "blocksize": "0x400", - "end": "0x27fff", - "length": "0x28000", - "name": "flash", - "start": "0x0", - "type": "flash" - }, - { - "blocksize": "0x0", - "end": "0x20003fff", - "length": "0x5000", - "name": "ram", - "start": "0x1ffff000", - "type": "ram" - } - ], - "target_name": "kw40z4" - }, - "0400": { - "flash_algo": { - "analyzer_address": "0x20004000", - "analyzer_supported": true, - "begin_data": "0x20003000", - "begin_stack": "0x20001000", - "instructions": [ - "0xe00abe00", - "0x62d780d", - "0x24084068", - "0xd3000040", - "0x1e644058", - "0x1c49d1fa", - "0x2a001e52", - "0x4770d1f2", - "0x68884972", - "0x7f80f010", - "0x2001d001", - "0x200c4770", - "0x20006048", - "0x496de7fa", - "0xf0106888", - "0xd0017f80", - "0x47702001", - "0xb1486a48", - "0x62482000", - "0xb1286a48", - "0x62482002", - "0xb1086a48", - "0xe7f22001", - "0xf0206888", - "0xf0404070", - "0x60885000", - "0xe7ea2000", - "0x4c5fb510", - "0xffe1f7ff", - "0x2001b108", - "0x68a0bd10", - "0x407ff420", - "0x402af440", - "0x68a060a0", - "0x2f040", - "0xbf0060a0", - "0xf01068a0", - "0xd1fb7f80", - "0xf02068a0", - "0x60a04070", - "0xf0106a60", - "0xd0010f02", - "0xe7e52001", - "0xe7e32000", - "0x4605b570", - "0xf7ff4c4d", - "0xb108ffbe", - "0xbd702001", - "0xf42068a0", - "0xf440407f", - "0x60a040aa", - "0x68a06025", - "0x4f040", - "0xbf0060a0", - "0xf01068a0", - "0xd1fb7f80", - "0xf02068a0", - "0x60a04070", - "0xf0106a60", - "0xd0010f02", - "0xe7e42001", - "0xe7e22000", - "0x47f0e92d", - "0x468a4606", - "0x4c3a4690", - "0x46474655", - "0xf03f018", - "0x2001d002", - "0x87f0e8bd", - "0xf7ff4647", - "0xb108ff8e", - "0xe7f72002", - "0xf02068a0", - "0x60a06000", - "0xf04068a0", - "0x60a00010", - "0x6026e00d", - "0x6320cf01", - "0xf04068a0", - "0x60a00001", - "0x68a0bf00", - "0x7f80f010", - "0x1d36d1fb", - "0x2d041f2d", - "0xf016d302", - "0xd1ec0f1f", - "0x2d04bf00", - "0x68a0d318", - "0x6000f020", - "0x68a060a0", - "0x10f040", - "0xe00d60a0", - "0xcf016026", - "0x68a06320", - "0x1f040", - "0xbf0060a0", - "0xf01068a0", - "0xd1fb7f80", - "0x1f2d1d36", - "0xd2ef2d04", - "0x68a2b1fd", - "0x6200f022", - "0x68a260a2", - "0x210f042", - "0xf04f60a2", - "0x21ff30ff", - "0x683ae005", - "0x201ea62", - "0x2094010", - "0x2d001e6d", - "0x6026d1f7", - "0x68a26320", - "0x201f042", - "0xbf0060a2", - "0xf01268a2", - "0xd1fb7f80", - "0x68a0bf00", - "0x4070f020", - "0x6a6060a0", - "0xf02f010", - "0x2003d001", - "0x2000e794", - "0xe792", - "0x400f0000", - "0x0", - "0x11111111", - "0x22222222", - "0x33333333", - "0x44444444", - "0x0", - "0x0", - "0x0" - ], - "load_address": "0x20000000", - "min_program_length": "0x4", - "page_buffers": [ - "0x20003000", - "0x20003800" - ], - "pc_eraseAll": "0x2000006d", - "pc_erase_sector": "0x200000b1", - "pc_init": "0x20000021", - "pc_program_page": "0x200000f9", - "static_base": "0x20000230" - }, - "memory_map": [ - { - "blocksize": "0x800", - "end": "0x3ffff", - "length": "0x40000", - "name": "flash", - "start": "0x0", - "type": "flash" - }, - { - "blocksize": "0x0", - "end": "0x20007fff", - "length": "0x8000", - "name": "ram", - "start": "0x20000000", - "type": "ram" - }, - { - "blocksize": "0x0", - "end": "0x400fffff", - "length": "0x100000", - "name": "ram", - "start": "0x40000000", - "type": "ram" - }, - { - "blocksize": "0x0", - "end": "0xe00fffff", - "length": "0x100000", - "name": "ram", - "start": "0xe0000000", - "type": "ram" - } - ], - "target_name": "maxwsnenv" - }, - "0405": { - "flash_algo": { - "analyzer_address": "0x20004000", - "analyzer_supported": true, - "begin_data": "0x20003000", - "begin_stack": "0x20001000", - "instructions": [ - "0xe00abe00", - "0x62d780d", - "0x24084068", - "0xd3000040", - "0x1e644058", - "0x1c49d1fa", - "0x2a001e52", - "0x4770d1f2", - "0x68884972", - "0x7f80f010", - "0x2001d001", - "0x200c4770", - "0x20006048", - "0x496de7fa", - "0xf0106888", - "0xd0017f80", - "0x47702001", - "0xb1486a48", - "0x62482000", - "0xb1286a48", - "0x62482002", - "0xb1086a48", - "0xe7f22001", - "0xf0206888", - "0xf0404070", - "0x60885000", - "0xe7ea2000", - "0x4c5fb510", - "0xffe1f7ff", - "0x2001b108", - "0x68a0bd10", - "0x407ff420", - "0x402af440", - "0x68a060a0", - "0x2f040", - "0xbf0060a0", - "0xf01068a0", - "0xd1fb7f80", - "0xf02068a0", - "0x60a04070", - "0xf0106a60", - "0xd0010f02", - "0xe7e52001", - "0xe7e32000", - "0x4605b570", - "0xf7ff4c4d", - "0xb108ffbe", - "0xbd702001", - "0xf42068a0", - "0xf440407f", - "0x60a040aa", - "0x68a06025", - "0x4f040", - "0xbf0060a0", - "0xf01068a0", - "0xd1fb7f80", - "0xf02068a0", - "0x60a04070", - "0xf0106a60", - "0xd0010f02", - "0xe7e42001", - "0xe7e22000", - "0x47f0e92d", - "0x468a4606", - "0x4c3a4690", - "0x46474655", - "0xf03f018", - "0x2001d002", - "0x87f0e8bd", - "0xf7ff4647", - "0xb108ff8e", - "0xe7f72002", - "0xf02068a0", - "0x60a06000", - "0xf04068a0", - "0x60a00010", - "0x6026e00d", - "0x6320cf01", - "0xf04068a0", - "0x60a00001", - "0x68a0bf00", - "0x7f80f010", - "0x1d36d1fb", - "0x2d041f2d", - "0xf016d302", - "0xd1ec0f1f", - "0x2d04bf00", - "0x68a0d318", - "0x6000f020", - "0x68a060a0", - "0x10f040", - "0xe00d60a0", - "0xcf016026", - "0x68a06320", - "0x1f040", - "0xbf0060a0", - "0xf01068a0", - "0xd1fb7f80", - "0x1f2d1d36", - "0xd2ef2d04", - "0x68a2b1fd", - "0x6200f022", - "0x68a260a2", - "0x210f042", - "0xf04f60a2", - "0x21ff30ff", - "0x683ae005", - "0x201ea62", - "0x2094010", - "0x2d001e6d", - "0x6026d1f7", - "0x68a26320", - "0x201f042", - "0xbf0060a2", - "0xf01268a2", - "0xd1fb7f80", - "0x68a0bf00", - "0x4070f020", - "0x6a6060a0", - "0xf02f010", - "0x2003d001", - "0x2000e794", - "0xe792", - "0x400f0000", - "0x0", - "0x11111111", - "0x22222222", - "0x33333333", - "0x44444444", - "0x0", - "0x0", - "0x0" - ], - "load_address": "0x20000000", - "min_program_length": "0x4", - "page_buffers": [ - "0x20003000", - "0x20003800" - ], - "pc_eraseAll": "0x2000006d", - "pc_erase_sector": "0x200000b1", - "pc_init": "0x20000021", - "pc_program_page": "0x200000f9", - "static_base": "0x20000230" - }, - "memory_map": [ - { - "blocksize": "0x800", - "end": "0x3ffff", - "length": "0x40000", - "name": "flash", - "start": "0x0", - "type": "flash" - }, - { - "blocksize": "0x0", - "end": "0x20007fff", - "length": "0x8000", - "name": "ram", - "start": "0x20000000", - "type": "ram" - }, - { - "blocksize": "0x0", - "end": "0x400fffff", - "length": "0x100000", - "name": "ram", - "start": "0x40000000", - "type": "ram" - }, - { - "blocksize": "0x0", - "end": "0xe00fffff", - "length": "0x100000", - "name": "ram", - "start": "0xe0000000", - "type": "ram" - } - ], - "target_name": "max32600mbed" - }, - "0824": { - "flash_algo": { - "analyzer_address": "0x10001000", - "analyzer_supported": true, - "begin_data": "0x10000800", - "begin_stack": "0x10000800", - "instructions": [ - "0xe00abe00", - "0x62d780d", - "0x24084068", - "0xd3000040", - "0x1e644058", - "0x1c49d1fa", - "0x2a001e52", - "0x4770d1f2", - "0x47700a80", - "0x21004842", - "0x22016301", - "0x63416342", - "0x6b416342", - "0xd0fc07c9", - "0x493e6382", - "0x70082002", - "0x47702000", - "0x47702000", - "0x4c3bb5f8", - "0x25002032", - "0x261f444c", - "0x493960a6", - "0x60206065", - "0x4f384449", - "0x91004620", - "0x696047b8", - "0xd10b2800", - "0x203460a6", - "0x60206065", - "0x60e04833", - "0x99004620", - "0x696047b8", - "0xd0002800", - "0xbdf82001", - "0x4d2bb5f8", - "0x444d0a84", - "0x492a606c", - "0x60ac2032", - "0x60284449", - "0x460f4e28", - "0x47b04628", - "0x28006968", - "0x606cd10b", - "0x60ac2034", - "0x48246028", - "0x463960e8", - "0x47b04628", - "0x28006968", - "0x2001d000", - "0xb5f8bdf8", - "0x54614", - "0x6861d10e", - "0x68e26820", - "0x68a11840", - "0x18401889", - "0x18406921", - "0x18406961", - "0x184069a1", - "0x61e04240", - "0xaa84e12", - "0x2132444e", - "0x60316070", - "0x60b04910", - "0x4f104449", - "0x91004630", - "0x697047b8", - "0xd10e2800", - "0x20336075", - "0x603060b4", - "0x2402001", - "0x480a60f0", - "0x46306130", - "0x47b89900", - "0x28006970", - "0x2001d000", - "0xbdf8", - "0x40048040", - "0x40048000", - "0x4", - "0x18", - "0x1fff1ff1", - "0x2ee0", - "0x0" - ], - "load_address": "0x10000000", - "min_program_length": "0x400", - "pc_eraseAll": "0x10000049", - "pc_erase_sector": "0x10000089", - "pc_init": "0x10000025", - "pc_program_page": "0x100000c7", - "static_base": "0x10000148" - }, - "memory_map": [ - { - "blocksize": "0x400", - "end": "0x7fff", - "length": "0x8000", - "name": "flash", - "start": "0x0", - "type": "flash" - }, - { - "blocksize": "0x0", - "end": "0x10001fff", - "length": "0x2000", - "name": "ram", - "start": "0x10000000", - "type": "ram" - } - ], - "target_name": "lpc824" - }, - "1010": { - "flash_algo": { - "analyzer_address": "0x10002000", - "analyzer_supported": true, - "begin_data": "0x2007c000", - "begin_stack": "0x10001000", - "instructions": [ - "0xe00abe00", - "0x62d780d", - "0x24084068", - "0xd3000040", - "0x1e644058", - "0x1c49d1fa", - "0x2a001e52", - "0x4770d1f2", - "0x7803e005", - "0x42931c40", - "0x2001d001", - "0x1e494770", - "0x2000d2f7", - "0x4770", - "0x28100b00", - "0x210ed302", - "0xd0eb01", - "0x486c4770", - "0x7801b510", - "0x102f021", - "0x22aa7001", - "0x23557302", - "0x78017303", - "0x101f021", - "0x73027001", - "0xf8d07303", - "0xf0411120", - "0xf8c00120", - "0xf1a01120", - "0xf8d00080", - "0x64911a0", - "0xf100d5fb", - "0x24010080", - "0x408cf880", - "0x113f04f", - "0x73026041", - "0x78017303", - "0x101f041", - "0x73027001", - "0xf1a07303", - "0xf8d00080", - "0x1491088", - "0xf100d5fb", - "0x2107006d", - "0x1097f880", - "0x109f04f", - "0x109bf880", - "0xf0417cc1", - "0x74c10102", - "0x77c377c2", - "0x4c2df800", - "0xf64e494b", - "0x44492060", - "0xf04f6008", - "0xbd100000", - "0x47702000", - "0x41f0e92d", - "0x20324c46", - "0x2500444c", - "0xe884271d", - "0xf10400a1", - "0x4e430114", - "0x46204688", - "0x696047b0", - "0x2034b960", - "0xa1e884", - "0x4641483c", - "0x68004448", - "0x462060e0", - "0x696047b0", - "0xd0002800", - "0xe8bd2001", - "0xe92d81f0", - "0xf7ff41f0", - "0x4d35ff87", - "0x444d4604", - "0xe9c52032", - "0xf1050400", - "0x4e320114", - "0x4628460f", - "0x47b060ac", - "0xb9686968", - "0xe9c52034", - "0x482b0400", - "0x444860ac", - "0x68004639", - "0x462860e8", - "0x696847b0", - "0xd0dc2800", - "0xe7da2001", - "0x41f0e92d", - "0x46140006", - "0x4925d11d", - "0x2fcf8d4", - "0xd03a4288", - "0x42884923", - "0x4923d037", - "0xd0344288", - "0x4131ea4f", - "0xd0304288", - "0x100e9d4", - "0xe9d44408", - "0x44111202", - "0x69214408", - "0x69614408", - "0x69a14408", - "0x42404408", - "0x463061e0", - "0xff42f7ff", - "0x21324d12", - "0x4f12444d", - "0x1000e9c5", - "0x114f105", - "0x468860a8", - "0x47b84628", - "0xb9806968", - "0xe9c52033", - "0xf44f0600", - "0xe9c56080", - "0x48074002", - "0x44484641", - "0x61286800", - "0x47b84628", - "0x28006968", - "0x2001d095", - "0xe793", - "0x400fc080", - "0x4", - "0x8", - "0x1fff1ff1", - "0x4e697370", - "0x12345678", - "0x87654321", - "0x0", - "0x0" - ], - "load_address": "0x10000000", - "min_program_length": "0x100", - "pc_eraseAll": "0x100000e1", - "pc_erase_sector": "0x10000123", - "pc_init": "0x10000047", - "pc_program_page": "0x10000169", - "static_base": "0x10000214" - }, - "memory_map": [ - { - "blocksize": "0x1000", - "end": "0xffff", - "length": "0x10000", - "name": "flash", - "start": "0x0", - "type": "flash" - }, - { - "blocksize": "0x8000", - "end": "0x7ffff", - "length": "0x70000", - "name": "flash", - "start": "0x10000", - "type": "flash" - }, - { - "blocksize": "0x0", - "end": "0x10007fff", - "length": "0x8000", - "name": "ram", - "start": "0x10000000", - "type": "ram" - }, - { - "blocksize": "0x0", - "end": "0x20083fff", - "length": "0x8000", - "name": "ram", - "start": "0x2007c000", - "type": "ram" - } - ], - "target_name": "lpc1768" - }, - "1017": { - "flash_algo": { - "analyzer_address": "0x20003000", - "analyzer_supported": true, - "begin_data": "0x20002000", - "begin_stack": "0x20001000", - "instructions": [ - "0xe00abe00", - "0x62d780d", - "0x24084068", - "0xd3000040", - "0x1e644058", - "0x1c49d1fa", - "0x2a001e52", - "0x4770d1f2", - "0x47702000", - "0x47702000", - "0x4c26b570", - "0x60602002", - "0x60e02001", - "0x68284d24", - "0xd00207c0", - "0x60602000", - "0xf000bd70", - "0xe7f6f82c", - "0x4c1eb570", - "0x60612102", - "0x4288491e", - "0x2001d302", - "0xe0006160", - "0x4d1a60a0", - "0xf81df000", - "0x7c06828", - "0x2000d0fa", - "0xbd706060", - "0x4605b5f8", - "0x4813088e", - "0x46142101", - "0x4f126041", - "0xc501cc01", - "0x7c06838", - "0x1e76d006", - "0x480dd1f8", - "0x60412100", - "0xbdf84608", - "0xf801f000", - "0x480ce7f2", - "0x6006840", - "0xd00b0e00", - "0x6849490a", - "0xd0072900", - "0x4a0a4909", - "0xd00007c3", - "0x1d09600a", - "0xd1f90840", - "0x4770", - "0x4001e500", - "0x4001e400", - "0x10001000", - "0x40010400", - "0x40010500", - "0x40010600", - "0x6e524635", - "0x0" - ], - "load_address": "0x20000000", - "min_program_length": "0x4", - "page_buffers": [ - "0x20002000", - "0x20002400" - ], - "pc_eraseAll": "0x20000029", - "pc_erase_sector": "0x20000049", - "pc_init": "0x20000021", - "pc_program_page": "0x20000071", - "static_base": "0x20000170" - }, - "memory_map": [ - { - "blocksize": "0x400", - "end": "0x3ffff", - "length": "0x40000", - "name": "flash", - "start": "0x0", - "type": "flash" - }, - { - "blocksize": "0x100", - "end": "0x100010ff", - "length": "0x100", - "name": "flash", - "start": "0x10001000", - "type": "flash" - }, - { - "blocksize": "0x0", - "end": "0x20003fff", - "length": "0x4000", - "name": "ram", - "start": "0x20000000", - "type": "ram" - } - ], - "target_name": "nrf51" - }, - "1018": { - "flash_algo": { - "analyzer_address": "0x10001000", - "analyzer_supported": true, - "begin_data": "0x10000800", - "begin_stack": "0x10000800", - "instructions": [ - "0xe00abe00", - "0x62d780d", - "0x24084068", - "0xd3000040", - "0x1e644058", - "0x1c49d1fa", - "0x2a001e52", - "0x4770d1f2", - "0x47700a80", - "0x21004842", - "0x22016301", - "0x63416342", - "0x6b416342", - "0xd0fc07c9", - "0x493e6382", - "0x70082002", - "0x47702000", - "0x47702000", - "0x4c3bb5f8", - "0x25002032", - "0x261f444c", - "0x493960a6", - "0x60206065", - "0x4f384449", - "0x91004620", - "0x696047b8", - "0xd10b2800", - "0x203460a6", - "0x60206065", - "0x60e04833", - "0x99004620", - "0x696047b8", - "0xd0002800", - "0xbdf82001", - "0x4d2bb5f8", - "0x444d0a84", - "0x492a606c", - "0x60ac2032", - "0x60284449", - "0x460f4e28", - "0x47b04628", - "0x28006968", - "0x606cd10b", - "0x60ac2034", - "0x48246028", - "0x463960e8", - "0x47b04628", - "0x28006968", - "0x2001d000", - "0xb5f8bdf8", - "0x54614", - "0x6861d10e", - "0x68e26820", - "0x68a11840", - "0x18401889", - "0x18406921", - "0x18406961", - "0x184069a1", - "0x61e04240", - "0xaa84e12", - "0x2132444e", - "0x60316070", - "0x60b04910", - "0x4f104449", - "0x91004630", - "0x697047b8", - "0xd10e2800", - "0x20336075", - "0x603060b4", - "0x2402001", - "0x480a60f0", - "0x46306130", - "0x47b89900", - "0x28006970", - "0x2001d000", - "0xbdf8", - "0x40048040", - "0x40048000", - "0x4", - "0x18", - "0x1fff1ff1", - "0x2ee0", - "0x0" - ], - "load_address": "0x10000000", - "min_program_length": "0x400", - "pc_eraseAll": "0x10000049", - "pc_erase_sector": "0x10000089", - "pc_init": "0x10000025", - "pc_program_page": "0x100000c7", - "static_base": "0x10000148" - }, - "memory_map": [ - { - "blocksize": "0x400", - "end": "0x7fff", - "length": "0x8000", - "name": "flash", - "start": "0x0", - "type": "flash" - }, - { - "blocksize": "0x0", - "end": "0x10001fff", - "length": "0x2000", - "name": "ram", - "start": "0x10000000", - "type": "ram" - } - ], - "target_name": "lpc824" - }, - "1019": { - "flash_algo": { - "analyzer_address": "0x20003000", - "analyzer_supported": true, - "begin_data": "0x20002000", - "begin_stack": "0x20001000", - "instructions": [ - "0xe00abe00", - "0x62d780d", - "0x24084068", - "0xd3000040", - "0x1e644058", - "0x1c49d1fa", - "0x2a001e52", - "0x4770d1f2", - "0x47702000", - "0x47702000", - "0x4c26b570", - "0x60602002", - "0x60e02001", - "0x68284d24", - "0xd00207c0", - "0x60602000", - "0xf000bd70", - "0xe7f6f82c", - "0x4c1eb570", - "0x60612102", - "0x4288491e", - "0x2001d302", - "0xe0006160", - "0x4d1a60a0", - "0xf81df000", - "0x7c06828", - "0x2000d0fa", - "0xbd706060", - "0x4605b5f8", - "0x4813088e", - "0x46142101", - "0x4f126041", - "0xc501cc01", - "0x7c06838", - "0x1e76d006", - "0x480dd1f8", - "0x60412100", - "0xbdf84608", - "0xf801f000", - "0x480ce7f2", - "0x6006840", - "0xd00b0e00", - "0x6849490a", - "0xd0072900", - "0x4a0a4909", - "0xd00007c3", - "0x1d09600a", - "0xd1f90840", - "0x4770", - "0x4001e500", - "0x4001e400", - "0x10001000", - "0x40010400", - "0x40010500", - "0x40010600", - "0x6e524635", - "0x0" - ], - "load_address": "0x20000000", - "min_program_length": "0x4", - "page_buffers": [ - "0x20002000", - "0x20002400" - ], - "pc_eraseAll": "0x20000029", - "pc_erase_sector": "0x20000049", - "pc_init": "0x20000021", - "pc_program_page": "0x20000071", - "static_base": "0x20000170" - }, - "memory_map": [ - { - "blocksize": "0x400", - "end": "0x3ffff", - "length": "0x40000", - "name": "flash", - "start": "0x0", - "type": "flash" - }, - { - "blocksize": "0x100", - "end": "0x100010ff", - "length": "0x100", - "name": "flash", - "start": "0x10001000", - "type": "flash" - }, - { - "blocksize": "0x0", - "end": "0x20003fff", - "length": "0x4000", - "name": "ram", - "start": "0x20000000", - "type": "ram" - } - ], - "target_name": "nrf51" - }, - "1040": { - "flash_algo": { - "analyzer_supported": false, - "begin_data": "0x100001c4", - "begin_stack": "0x10001000", - "instructions": [ - "0xe00abe00", - "0x62d780d", - "0x24084068", - "0xd3000040", - "0x1e644058", - "0x1c49d1fa", - "0x2a001e52", - "0x4770d1f2", - "0x7803e005", - "0x42931c40", - "0x2001d001", - "0x1e494770", - "0x2000d2f7", - "0x4770", - "0x47700b00", - "0x484e494f", - "0x60084449", - "0x2100484e", - "0x22016301", - "0x63416342", - "0x6b416342", - "0xd0fc07c9", - "0x49496382", - "0x39402002", - "0x20007008", - "0x20004770", - "0xb5f84770", - "0x20324c45", - "0x2500444c", - "0x46222607", - "0x4621c261", - "0x4f423114", - "0x91004620", - "0x696047b8", - "0xd10c2800", - "0x46212034", - "0x483ac161", - "0x68004448", - "0x462060e0", - "0x47b89900", - "0x28006960", - "0x2001d000", - "0xb5f8bdf8", - "0xb044d35", - "0x2032444d", - "0x4629606c", - "0x311460ac", - "0x4e326028", - "0x4628460f", - "0x696847b0", - "0xd10d2800", - "0x2034606c", - "0x602860ac", - "0x46394829", - "0x68004448", - "0x462860e8", - "0x696847b0", - "0xd0002800", - "0xbdf82001", - "0x6b5f8", - "0xd11e4614", - "0x180200b", - "0x6bc11820", - "0x42814823", - "0x4823d038", - "0xd0354281", - "0x42814822", - "0x4822d032", - "0xd02f4281", - "0x68206861", - "0x184068e2", - "0x188968a1", - "0x69211840", - "0x69611840", - "0x69a11840", - "0x42401840", - "0x4d1461e0", - "0x444d0b30", - "0x60682132", - "0x60a86029", - "0x31144629", - "0x46284f10", - "0x47b89100", - "0x28006968", - "0x606ed110", - "0x60ac2033", - "0x20016028", - "0x60e80280", - "0x44484806", - "0x61286800", - "0x99004628", - "0x696847b8", - "0xd0002800", - "0xbdf82001", - "0x2ee0", - "0x4", - "0x40048040", - "0x8", - "0x1fff1ff1", - "0x4e697370", - "0x12345678", - "0x87654321", - "0x43218765", - "0x0", - "0x0" - ], - "load_address": "0x10000000", - "min_program_length": "0x100", - "pc_eraseAll": "0x1000006b", - "pc_erase_sector": "0x100000ab", - "pc_init": "0x1000003d", - "pc_program_page": "0x100000ed", - "static_base": "0x1000019c" - }, - "memory_map": [ - { - "blocksize": "0x1000", - "end": "0x7fff", - "length": "0x8000", - "name": "flash", - "start": "0x0", - "type": "flash" - }, - { - "blocksize": "0x0", - "end": "0x10000fff", - "length": "0x1000", - "name": "ram", - "start": "0x10000000", - "type": "ram" - } - ], - "target_name": "lpc11u24" - }, - "1050": { - "flash_algo": { - "analyzer_address": "0x10000800", - "analyzer_supported": true, - "begin_data": "0x10000400", - "begin_stack": "0x10001000", - "instructions": [ - "0xe00abe00", - "0x62d780d", - "0x24084068", - "0xd3000040", - "0x1e644058", - "0x1c49d1fa", - "0x2a001e52", - "0x4770d1f2", - "0x47700a80", - "0x484e494f", - "0x60084449", - "0x2100484e", - "0x22016301", - "0x63416342", - "0x6b416342", - "0xd0fc07c9", - "0x49496382", - "0x39402002", - "0x20007008", - "0x20004770", - "0xb5f84770", - "0x20324c45", - "0x2500444c", - "0x4622260f", - "0x4621c261", - "0x4f423114", - "0x91004620", - "0x696047b8", - "0xd10c2800", - "0x46212034", - "0x483ac161", - "0x68004448", - "0x462060e0", - "0x47b89900", - "0x28006960", - "0x2001d000", - "0xb5f8bdf8", - "0xa844d35", - "0x2032444d", - "0x4629606c", - "0x311460ac", - "0x4e326028", - "0x4628460f", - "0x696847b0", - "0xd10d2800", - "0x2034606c", - "0x602860ac", - "0x46394829", - "0x68004448", - "0x462860e8", - "0x696847b0", - "0xd0002800", - "0xbdf82001", - "0x4614b5f8", - "0xd11e0006", - "0x180200b", - "0x6bc11820", - "0x42814823", - "0x4823d038", - "0xd0354281", - "0x42814822", - "0x4822d032", - "0xd02f4281", - "0x68206861", - "0x184068e2", - "0x188968a1", - "0x69211840", - "0x69611840", - "0x69a11840", - "0x42401840", - "0x4d1461e0", - "0x444d0ab0", - "0x60682132", - "0x60a86029", - "0x31144629", - "0x46284f10", - "0x47b89100", - "0x28006968", - "0x606ed110", - "0x60ac2033", - "0x20016028", - "0x60e80280", - "0x44484806", - "0x61286800", - "0x99004628", - "0x696847b8", - "0xd0002800", - "0xbdf82001", - "0x2ee0", - "0x4", - "0x40048040", - "0x8", - "0x1fff1ff1", - "0x4e697370", - "0x12345678", - "0x87654321", - "0x43218765" - ], - "load_address": "0x10000000", - "min_program_length": "0x40", - "pc_eraseAll": "0x10000052", - "pc_erase_sector": "0x10000092", - "pc_init": "0x10000024", - "pc_program_page": "0x100000d4", - "static_base": "0x10000300" - }, - "memory_map": [ - { - "blocksize": "0x400", - "end": "0x3fff", - "length": "0x4000", - "name": "flash", - "start": "0x0", - "type": "flash" - }, - { - "blocksize": "0x0", - "end": "0x10000fff", - "length": "0x1000", - "name": "ram", - "start": "0x10000000", - "type": "ram" - } - ], - "target_name": "lpc800" - }, - "1054": { - "flash_algo": { - "analyzer_address": "0x20010000", - "analyzer_supported": true, - "begin_data": "0x20003000", - "begin_stack": "0x20001000", - "instructions": [ - "0xe00abe00", - "0x62d780d", - "0x24084068", - "0xd3000040", - "0x1e644058", - "0x1c49d1fa", - "0x2a001e52", - "0x4770d1f2", - "0x21002210", - "0xf8c00690", - "0x4a2b2630", - "0xf0236813", - "0x60134380", - "0x1280f8c0", - "0x1284f8c0", - "0x68134a27", - "0x4370f423", - "0xf8c06013", - "0x46081380", - "0x20004770", - "0xb5104770", - "0x20002107", - "0xf844f000", - "0xbf182800", - "0x4a1fbd10", - "0xe8bd2107", - "0x20004010", - "0xb864f000", - "0xbc4b510", - "0x46084621", - "0xf834f000", - "0xbf182800", - "0x4a17bd10", - "0xe8bd4621", - "0x46084010", - "0xb854f000", - "0x4614b570", - "0xd10e0005", - "0x100e9d4", - "0xe9d44408", - "0x44111202", - "0x69214408", - "0x69614408", - "0x69a14408", - "0x42404408", - "0xbe861e0", - "0xf0004601", - "0x2800f813", - "0xbd70bf18", - "0x46214b06", - "0xe8bd4628", - "0xf44f4070", - "0xf0007280", - "0xb818", - "0x40000500", - "0x40000400", - "0xb71b00", - "0xb08bb500", - "0x92002232", - "0x101e9cd", - "0x46684a39", - "0x4790a906", - "0x28009806", - "0xf600bf18", - "0xb00b10c4", - "0xb500bd00", - "0xf04fb08b", - "0x92030c33", - "0xc000f8cd", - "0x101e9cd", - "0x707af44f", - "0xf0f0fbb3", - "0x4a2d9004", - "0xa9064668", - "0x98064790", - "0xbf182800", - "0x10c4f600", - "0xbd00b00b", - "0xb08bb500", - "0x93002334", - "0x101e9cd", - "0x707af44f", - "0xf0f0fbb2", - "0x4a229003", - "0xa9064668", - "0x98064790", - "0xbf182800", - "0x10c4f600", - "0xbd00b00b", - "0xb08bb500", - "0x9300233b", - "0x101e9cd", - "0x707af44f", - "0xf0f0fbb2", - "0x4a179003", - "0xa9064668", - "0x98064790", - "0xbf182800", - "0x10c4f600", - "0xbd00b00b", - "0xb08bb500", - "0x92002235", - "0x101e9cd", - "0x46684a0e", - "0x4790a906", - "0x28009806", - "0xf600bf18", - "0xb00b10c4", - "0xb500bd00", - "0x2338b08b", - "0x93009203", - "0x101e9cd", - "0x46684a05", - "0x4790a906", - "0x28009806", - "0xf600bf18", - "0xb00b10c4", - "0xbd00", - "0x3000205", - "0x0" - ], - "load_address": "0x20000000", - "min_program_length": "0x8", - "page_buffers": [ - "0x20003000", - "0x20004000" - ], - "page_size": "0x100", - "pc_eraseAll": "0x20000053", - "pc_erase_sector": "0x20000071", - "pc_init": "0x20000021", - "pc_program_page": "0x20000091", - "pc_unInit": "0x2000004f", - "static_base": "0x200001dc" - }, - "memory_map": [ - { - "blocksize": "0x100", - "end": "0x3ffff", - "length": "0x40000", - "name": "flash", - "start": "0x0", - "type": "flash" - }, - { - "blocksize": "0x0", - "end": "0x3007fff", - "length": "0x8000", - "name": "rom", - "start": "0x3000000", - "type": "rom" - }, - { - "blocksize": "0x0", - "end": "0x4007fff", - "length": "0x8000", - "name": "sramx", - "start": "0x4000000", - "type": "ram" - }, - { - "blocksize": "0x0", - "end": "0x2000ffff", - "length": "0x10000", - "name": "sram0", - "start": "0x20000000", - "type": "ram" - }, - { - "blocksize": "0x0", - "end": "0x2001ffff", - "length": "0x10000", - "name": "sram1", - "start": "0x20010000", - "type": "ram" - }, - { - "blocksize": "0x0", - "end": "0x20027fff", - "length": "0x8000", - "name": "sram2", - "start": "0x20020000", - "type": "ram" - } - ], - "target_name": "lpc54114" - }, - "1060": { - "flash_algo": { - "analyzer_address": "0x10002000", - "analyzer_supported": true, - "begin_data": "0x10000a00", - "begin_stack": "0x10000800", - "instructions": [ - "0xe00abe00", - "0x62d780d", - "0x24084068", - "0xd3000040", - "0x1e644058", - "0x1c49d1fa", - "0x2a001e52", - "0x4770d1f2", - "0x28100b00", - "0x210ebf24", - "0xd0eb01", - "0xe92d4770", - "0xf8df4df0", - "0x4606831c", - "0x460c44c8", - "0xf8d8", - "0x1c402500", - "0xf8c8", - "0xf01f010", - "0x461749c1", - "0x2080f44f", - "0x63c8bf14", - "0x5306388", - "0xa2f8f8df", - "0xf04f0d00", - "0x44ca0b00", - "0xf8cad111", - "0xf44fb010", - "0xf8ca5080", - "0xe9ca6000", - "0xf8ca0b01", - "0xf8d8b00c", - "0x4651000c", - "0xf1a16882", - "0x47900080", - "0x2018b9c0", - "0xb008f8ca", - "0xb003e9ca", - "0xf5b4b1cc", - "0xbf8c7f80", - "0x7b80f44f", - "0x197046a3", - "0xb00e9ca", - "0xcf8d8", - "0x19794aa9", - "0x6843444a", - "0x80f1a2", - "0xb1104798", - "0xe8bd2001", - "0x445d8df0", - "0x40bebb4", - "0x2000d1e5", - "0x8df0e8bd", - "0x41f0e92d", - "0x8274f8df", - "0x60e0f642", - "0x4d9e44c8", - "0x8f8c8", - "0x70282000", - "0x732820aa", - "0x73282055", - "0xf8052001", - "0x22000c40", - "0xf0002112", - "0x2200f91a", - "0x4610210d", - "0xf915f000", - "0x210d2200", - "0xf0002001", - "0x2200f910", - "0x20022113", - "0xf90bf000", - "0x68204c8c", - "0x5000f440", - "0x6a206020", - "0x2084f440", - "0x6c206220", - "0x2000f440", - "0xf44f6420", - "0x63e72780", - "0x61a6117e", - "0xf4406c68", - "0x64683080", - "0xf8c52002", - "0x22050134", - "0xf0002107", - "0x2205f8ee", - "0x20002116", - "0xf8e9f000", - "0x210f2205", - "0xf0002000", - "0x2205f8e4", - "0x20002110", - "0xf8dff000", - "0x21112205", - "0xf0002000", - "0x2205f8da", - "0x20002112", - "0xf8d5f000", - "0xf44f4874", - "0x6800727a", - "0xf8c86940", - "0xf8d8000c", - "0xfbb11008", - "0xf8d5f1f2", - "0xf8d02134", - "0xf002c000", - "0xfbb1021f", - "0x496cf3f2", - "0xfba1486c", - "0x8892103", - "0x444822c0", - "0x280047e0", - "0x61e6bf04", - "0x81f0e8bd", - "0x61e663a7", - "0xe8bd2001", - "0x200081f0", - "0xe92d4770", - "0x4c6341f0", - "0x444c2032", - "0x251d2700", - "0xe9c460a5", - "0x4e600700", - "0x114f104", - "0x47b04620", - "0xb9806960", - "0x60a52034", - "0x700e9c4", - "0xf1044852", - "0x44480114", - "0x60e06880", - "0x47b04620", - "0x28006960", - "0xe8bdbf08", - "0x200181f0", - "0x81f0e8bd", - "0x5f20f1b0", - "0xf5b0bf32", - "0x20002f00", - "0xb5704770", - "0x2c100b04", - "0x200ebf24", - "0x4d4eb00", - "0x4d4a2032", - "0x444d4e4a", - "0x114f105", - "0x400e9c5", - "0x60ac4628", - "0x696847b0", - "0x2034b978", - "0x400e9c5", - "0x60ac483b", - "0xf1054448", - "0x68800114", - "0x462860e8", - "0x696847b0", - "0xbf082800", - "0x2001bd70", - "0xe92dbd70", - "0x4f3341f0", - "0x444f4605", - "0x68784614", - "0x1c404a31", - "0xf0106078", - "0xf44f0f01", - "0xbf145000", - "0x619061d0", - "0x5f20f1b5", - "0x4622d305", - "0x5020f1a5", - "0x41f0e8bd", - "0xf5b5e6bd", - "0xd3052f00", - "0xf5a54622", - "0xe8bd2000", - "0xe6b441f0", - "0xe9d4b975", - "0x44080100", - "0x1202e9d4", - "0x44084411", - "0x44086921", - "0x44086961", - "0x440869a1", - "0x61e04240", - "0x28100b28", - "0x210ebf24", - "0xd0eb01", - "0x4e1e2132", - "0x8078f8df", - "0xe9c6444e", - "0x60b01000", - "0x114f106", - "0x47c04630", - "0xb9886970", - "0xe9c62033", - "0xf44f0500", - "0xe9c67000", - "0x68b84002", - "0xf1066130", - "0x46300114", - "0x697047c0", - "0xbf082800", - "0x81f0e8bd", - "0xe8bd2001", - "0xeb0181f0", - "0x490e1040", - "0x80eb01", - "0xf0216801", - "0x60010107", - "0x43116801", - "0x47706001", - "0x4", - "0x20098000", - "0xb4", - "0x400fc080", - "0x1fff1ff8", - "0xcccccccd", - "0x34", - "0x14", - "0x1fff1ff1", - "0x4002c000", - "0x0", - "0x1", - "0x0", - "0x0", - "0x0" - ], - "load_address": "0x10000000", - "min_program_length": "0x200", - "page_size": "0x200", - "pc_eraseAll": "0x100001db", - "pc_erase_sector": "0x10000225", - "pc_init": "0x100000d5", - "pc_program_page": "0x1000027f", - "pc_unInit": "0x100001d7", - "static_base": "0x10000420" - }, - "memory_map": [ - { - "blocksize": "0x1000", - "end": "0xffff", - "length": "0x10000", - "name": "flash", - "start": "0x0", - "type": "flash" - }, - { - "blocksize": "0x8000", - "end": "0x7ffff", - "length": "0x70000", - "name": "flash", - "start": "0x10000", - "type": "flash" - }, - { - "blocksize": "0x0", - "end": "0x1000ffff", - "length": "0x10000", - "name": "ram", - "start": "0x10000000", - "type": "ram" - }, - { - "blocksize": "0x400", - "end": "0x287fffff", - "length": "0x800000", - "name": "flash", - "start": "0x28000000", - "type": "flash" - } - ], - "target_name": "lpc4088qsb" - }, - "1062": { - "flash_algo": { - "analyzer_address": "0x10002000", - "analyzer_supported": true, - "begin_data": "0x10000a00", - "begin_stack": "0x10000800", - "instructions": [ - "0xe00abe00", - "0x62d780d", - "0x24084068", - "0xd3000040", - "0x1e644058", - "0x1c49d1fa", - "0x2a001e52", - "0x4770d1f2", - "0x28100b00", - "0x210ebf24", - "0xd0eb01", - "0xe92d4770", - "0xf8df4df0", - "0x4606831c", - "0x460c44c8", - "0xf8d8", - "0x1c402500", - "0xf8c8", - "0xf01f010", - "0x461749c1", - "0x2080f44f", - "0x63c8bf14", - "0x5306388", - "0xa2f8f8df", - "0xf04f0d00", - "0x44ca0b00", - "0xf8cad111", - "0xf44fb010", - "0xf8ca5080", - "0xe9ca6000", - "0xf8ca0b01", - "0xf8d8b00c", - "0x4651000c", - "0xf1a16882", - "0x47900080", - "0x2018b9c0", - "0xb008f8ca", - "0xb003e9ca", - "0xf5b4b1cc", - "0xbf8c7f80", - "0x7b80f44f", - "0x197046a3", - "0xb00e9ca", - "0xcf8d8", - "0x19794aa9", - "0x6843444a", - "0x80f1a2", - "0xb1104798", - "0xe8bd2001", - "0x445d8df0", - "0x40bebb4", - "0x2000d1e5", - "0x8df0e8bd", - "0x41f0e92d", - "0x8274f8df", - "0x60e0f642", - "0x4d9e44c8", - "0x8f8c8", - "0x70282000", - "0x732820aa", - "0x73282055", - "0xf8052001", - "0x22000c40", - "0xf0002112", - "0x2200f91a", - "0x4610210d", - "0xf915f000", - "0x210d2200", - "0xf0002001", - "0x2200f910", - "0x20022113", - "0xf90bf000", - "0x68204c8c", - "0x5000f440", - "0x6a206020", - "0x2084f440", - "0x6c206220", - "0x2000f440", - "0xf44f6420", - "0x63e72780", - "0x61a6117e", - "0xf4406c68", - "0x64683080", - "0xf8c52002", - "0x22050134", - "0xf0002107", - "0x2205f8ee", - "0x20002116", - "0xf8e9f000", - "0x210f2205", - "0xf0002000", - "0x2205f8e4", - "0x20002110", - "0xf8dff000", - "0x21112205", - "0xf0002000", - "0x2205f8da", - "0x20002112", - "0xf8d5f000", - "0xf44f4874", - "0x6800727a", - "0xf8c86940", - "0xf8d8000c", - "0xfbb11008", - "0xf8d5f1f2", - "0xf8d02134", - "0xf002c000", - "0xfbb1021f", - "0x496cf3f2", - "0xfba1486c", - "0x8892103", - "0x444822c0", - "0x280047e0", - "0x61e6bf04", - "0x81f0e8bd", - "0x61e663a7", - "0xe8bd2001", - "0x200081f0", - "0xe92d4770", - "0x4c6341f0", - "0x444c2032", - "0x251d2700", - "0xe9c460a5", - "0x4e600700", - "0x114f104", - "0x47b04620", - "0xb9806960", - "0x60a52034", - "0x700e9c4", - "0xf1044852", - "0x44480114", - "0x60e06880", - "0x47b04620", - "0x28006960", - "0xe8bdbf08", - "0x200181f0", - "0x81f0e8bd", - "0x5f20f1b0", - "0xf5b0bf32", - "0x20002f00", - "0xb5704770", - "0x2c100b04", - "0x200ebf24", - "0x4d4eb00", - "0x4d4a2032", - "0x444d4e4a", - "0x114f105", - "0x400e9c5", - "0x60ac4628", - "0x696847b0", - "0x2034b978", - "0x400e9c5", - "0x60ac483b", - "0xf1054448", - "0x68800114", - "0x462860e8", - "0x696847b0", - "0xbf082800", - "0x2001bd70", - "0xe92dbd70", - "0x4f3341f0", - "0x444f4605", - "0x68784614", - "0x1c404a31", - "0xf0106078", - "0xf44f0f01", - "0xbf145000", - "0x619061d0", - "0x5f20f1b5", - "0x4622d305", - "0x5020f1a5", - "0x41f0e8bd", - "0xf5b5e6bd", - "0xd3052f00", - "0xf5a54622", - "0xe8bd2000", - "0xe6b441f0", - "0xe9d4b975", - "0x44080100", - "0x1202e9d4", - "0x44084411", - "0x44086921", - "0x44086961", - "0x440869a1", - "0x61e04240", - "0x28100b28", - "0x210ebf24", - "0xd0eb01", - "0x4e1e2132", - "0x8078f8df", - "0xe9c6444e", - "0x60b01000", - "0x114f106", - "0x47c04630", - "0xb9886970", - "0xe9c62033", - "0xf44f0500", - "0xe9c67000", - "0x68b84002", - "0xf1066130", - "0x46300114", - "0x697047c0", - "0xbf082800", - "0x81f0e8bd", - "0xe8bd2001", - "0xeb0181f0", - "0x490e1040", - "0x80eb01", - "0xf0216801", - "0x60010107", - "0x43116801", - "0x47706001", - "0x4", - "0x20098000", - "0xb4", - "0x400fc080", - "0x1fff1ff8", - "0xcccccccd", - "0x34", - "0x14", - "0x1fff1ff1", - "0x4002c000", - "0x0", - "0x1", - "0x0", - "0x0", - "0x0" - ], - "load_address": "0x10000000", - "min_program_length": "0x200", - "page_size": "0x200", - "pc_eraseAll": "0x100001db", - "pc_erase_sector": "0x10000225", - "pc_init": "0x100000d5", - "pc_program_page": "0x1000027f", - "pc_unInit": "0x100001d7", - "static_base": "0x10000420" - }, - "memory_map": [ - { - "blocksize": "0x1000", - "end": "0xffff", - "length": "0x10000", - "name": "flash", - "start": "0x0", - "type": "flash" - }, - { - "blocksize": "0x8000", - "end": "0x7ffff", - "length": "0x70000", - "name": "flash", - "start": "0x10000", - "type": "flash" - }, - { - "blocksize": "0x0", - "end": "0x1000ffff", - "length": "0x10000", - "name": "ram", - "start": "0x10000000", - "type": "ram" - }, - { - "blocksize": "0x400", - "end": "0x28ffffff", - "length": "0x1000000", - "name": "flash", - "start": "0x28000000", - "type": "flash" - } - ], - "target_name": "lpc4088dm" - }, - "1070": { - "flash_algo": { - "analyzer_address": "0x20003000", - "analyzer_supported": true, - "begin_data": "0x20002000", - "begin_stack": "0x20001000", - "instructions": [ - "0xe00abe00", - "0x62d780d", - "0x24084068", - "0xd3000040", - "0x1e644058", - "0x1c49d1fa", - "0x2a001e52", - "0x4770d1f2", - "0x47702000", - "0x47702000", - "0x4c26b570", - "0x60602002", - "0x60e02001", - "0x68284d24", - "0xd00207c0", - "0x60602000", - "0xf000bd70", - "0xe7f6f82c", - "0x4c1eb570", - "0x60612102", - "0x4288491e", - "0x2001d302", - "0xe0006160", - "0x4d1a60a0", - "0xf81df000", - "0x7c06828", - "0x2000d0fa", - "0xbd706060", - "0x4605b5f8", - "0x4813088e", - "0x46142101", - "0x4f126041", - "0xc501cc01", - "0x7c06838", - "0x1e76d006", - "0x480dd1f8", - "0x60412100", - "0xbdf84608", - "0xf801f000", - "0x480ce7f2", - "0x6006840", - "0xd00b0e00", - "0x6849490a", - "0xd0072900", - "0x4a0a4909", - "0xd00007c3", - "0x1d09600a", - "0xd1f90840", - "0x4770", - "0x4001e500", - "0x4001e400", - "0x10001000", - "0x40010400", - "0x40010500", - "0x40010600", - "0x6e524635", - "0x0" - ], - "load_address": "0x20000000", - "min_program_length": "0x4", - "page_buffers": [ - "0x20002000", - "0x20002400" - ], - "pc_eraseAll": "0x20000029", - "pc_erase_sector": "0x20000049", - "pc_init": "0x20000021", - "pc_program_page": "0x20000071", - "static_base": "0x20000170" - }, - "memory_map": [ - { - "blocksize": "0x400", - "end": "0x3ffff", - "length": "0x40000", - "name": "flash", - "start": "0x0", - "type": "flash" - }, - { - "blocksize": "0x100", - "end": "0x100010ff", - "length": "0x100", - "name": "flash", - "start": "0x10001000", - "type": "flash" - }, - { - "blocksize": "0x0", - "end": "0x20003fff", - "length": "0x4000", - "name": "ram", - "start": "0x20000000", - "type": "ram" - } - ], - "target_name": "nrf51" - }, - "1080": { - "flash_algo": { - "analyzer_address": "0x20003000", - "analyzer_supported": true, - "begin_data": "0x20001000", - "begin_stack": "0x20002800", - "instructions": [ - "0xe00abe00", - "0x62d780d", - "0x24084068", - "0xd3000040", - "0x1e644058", - "0x1c49d1fa", - "0x2a001e52", - "0x4770d1f2", - "0x49384839", - "0x49396041", - "0x20006041", - "0x49364770", - "0x60c82034", - "0x47702000", - "0x47702000", - "0xb5004a32", - "0x6006910", - "0xf7ffd501", - "0x68d0ffeb", - "0xd1fc07c0", - "0xf0406910", - "0x61100004", - "0xf0406910", - "0x61100040", - "0x7c068d0", - "0x6910d1fc", - "0x4f020", - "0x20006110", - "0x4a25bd00", - "0x4603b500", - "0x6006910", - "0xf7ffd501", - "0x68d1ffcf", - "0xd1fc07c9", - "0xf0406910", - "0x61100002", - "0x69106153", - "0x40f040", - "0x68d06110", - "0xd1fc07c0", - "0xf0206910", - "0x61100002", - "0xbd002000", - "0x4d16b570", - "0x460e4603", - "0x24006928", - "0xd5010600", - "0xffb0f7ff", - "0x7c068e8", - "0xe014d1fc", - "0x1f040", - "0x88106128", - "0x68e88018", - "0xd1fc07c0", - "0x88198810", - "0xd0054288", - "0xf0206928", - "0x61280001", - "0xbd702001", - "0x1c9b1c92", - "0x69281c64", - "0xf56ebb4", - "0xf020d3e6", - "0x61280001", - "0xbd702000", - "0x45670123", - "0x40022000", - "0xcdef89ab", - "0x0" - ], - "load_address": "0x20000000", - "min_program_length": "0x2", - "page_buffers": [ - "0x20001000", - "0x20001800" - ], - "pc_eraseAll": "0x2000003d", - "pc_erase_sector": "0x20000073", - "pc_init": "0x2000002f", - "pc_program_page": "0x200000ad", - "static_base": "0x20000200" - }, - "memory_map": [ - { - "blocksize": "0x800", - "end": "0x807ffff", - "length": "0x80000", - "name": "flash", - "start": "0x8000000", - "type": "flash" - }, - { - "blocksize": "0x0", - "end": "0x2000ffff", - "length": "0x10000", - "name": "ram", - "start": "0x20000000", - "type": "ram" - } - ], - "target_name": "stm32f103rc" - }, - "1090": { - "flash_algo": { - "analyzer_address": "0x20003000", - "analyzer_supported": true, - "begin_data": "0x20002000", - "begin_stack": "0x20001000", - "instructions": [ - "0xe00abe00", - "0x62d780d", - "0x24084068", - "0xd3000040", - "0x1e644058", - "0x1c49d1fa", - "0x2a001e52", - "0x4770d1f2", - "0x47702000", - "0x47702000", - "0x4c26b570", - "0x60602002", - "0x60e02001", - "0x68284d24", - "0xd00207c0", - "0x60602000", - "0xf000bd70", - "0xe7f6f82c", - "0x4c1eb570", - "0x60612102", - "0x4288491e", - "0x2001d302", - "0xe0006160", - "0x4d1a60a0", - "0xf81df000", - "0x7c06828", - "0x2000d0fa", - "0xbd706060", - "0x4605b5f8", - "0x4813088e", - "0x46142101", - "0x4f126041", - "0xc501cc01", - "0x7c06838", - "0x1e76d006", - "0x480dd1f8", - "0x60412100", - "0xbdf84608", - "0xf801f000", - "0x480ce7f2", - "0x6006840", - "0xd00b0e00", - "0x6849490a", - "0xd0072900", - "0x4a0a4909", - "0xd00007c3", - "0x1d09600a", - "0xd1f90840", - "0x4770", - "0x4001e500", - "0x4001e400", - "0x10001000", - "0x40010400", - "0x40010500", - "0x40010600", - "0x6e524635", - "0x0" - ], - "load_address": "0x20000000", - "min_program_length": "0x4", - "page_buffers": [ - "0x20002000", - "0x20002400" - ], - "pc_eraseAll": "0x20000029", - "pc_erase_sector": "0x20000049", - "pc_init": "0x20000021", - "pc_program_page": "0x20000071", - "static_base": "0x20000170" - }, - "memory_map": [ - { - "blocksize": "0x400", - "end": "0x3ffff", - "length": "0x40000", - "name": "flash", - "start": "0x0", - "type": "flash" - }, - { - "blocksize": "0x100", - "end": "0x100010ff", - "length": "0x100", - "name": "flash", - "start": "0x10001000", - "type": "flash" - }, - { - "blocksize": "0x0", - "end": "0x20003fff", - "length": "0x4000", - "name": "ram", - "start": "0x20000000", - "type": "ram" - } - ], - "target_name": "nrf51" - }, - "1095": { - "flash_algo": { - "analyzer_address": "0x20003000", - "analyzer_supported": true, - "begin_data": "0x20002000", - "begin_stack": "0x20001000", - "instructions": [ - "0xe00abe00", - "0x62d780d", - "0x24084068", - "0xd3000040", - "0x1e644058", - "0x1c49d1fa", - "0x2a001e52", - "0x4770d1f2", - "0x47702000", - "0x47702000", - "0x4c26b570", - "0x60602002", - "0x60e02001", - "0x68284d24", - "0xd00207c0", - "0x60602000", - "0xf000bd70", - "0xe7f6f82c", - "0x4c1eb570", - "0x60612102", - "0x4288491e", - "0x2001d302", - "0xe0006160", - "0x4d1a60a0", - "0xf81df000", - "0x7c06828", - "0x2000d0fa", - "0xbd706060", - "0x4605b5f8", - "0x4813088e", - "0x46142101", - "0x4f126041", - "0xc501cc01", - "0x7c06838", - "0x1e76d006", - "0x480dd1f8", - "0x60412100", - "0xbdf84608", - "0xf801f000", - "0x480ce7f2", - "0x6006840", - "0xd00b0e00", - "0x6849490a", - "0xd0072900", - "0x4a0a4909", - "0xd00007c3", - "0x1d09600a", - "0xd1f90840", - "0x4770", - "0x4001e500", - "0x4001e400", - "0x10001000", - "0x40010400", - "0x40010500", - "0x40010600", - "0x6e524635", - "0x0" - ], - "load_address": "0x20000000", - "min_program_length": "0x4", - "page_buffers": [ - "0x20002000", - "0x20002400" - ], - "pc_eraseAll": "0x20000029", - "pc_erase_sector": "0x20000049", - "pc_init": "0x20000021", - "pc_program_page": "0x20000071", - "static_base": "0x20000170" - }, - "memory_map": [ - { - "blocksize": "0x400", - "end": "0x3ffff", - "length": "0x40000", - "name": "flash", - "start": "0x0", - "type": "flash" - }, - { - "blocksize": "0x100", - "end": "0x100010ff", - "length": "0x100", - "name": "flash", - "start": "0x10001000", - "type": "flash" - }, - { - "blocksize": "0x0", - "end": "0x20003fff", - "length": "0x4000", - "name": "ram", - "start": "0x20000000", - "type": "ram" - } - ], - "target_name": "nrf51" - }, - "1100": { - "flash_algo": { - "analyzer_address": "0x20003000", - "analyzer_supported": true, - "begin_data": "0x20002000", - "begin_stack": "0x20001000", - "instructions": [ - "0xe00abe00", - "0x62d780d", - "0x24084068", - "0xd3000040", - "0x1e644058", - "0x1c49d1fa", - "0x2a001e52", - "0x4770d1f2", - "0x47702000", - "0x47702000", - "0x4c26b570", - "0x60602002", - "0x60e02001", - "0x68284d24", - "0xd00207c0", - "0x60602000", - "0xf000bd70", - "0xe7f6f82c", - "0x4c1eb570", - "0x60612102", - "0x4288491e", - "0x2001d302", - "0xe0006160", - "0x4d1a60a0", - "0xf81df000", - "0x7c06828", - "0x2000d0fa", - "0xbd706060", - "0x4605b5f8", - "0x4813088e", - "0x46142101", - "0x4f126041", - "0xc501cc01", - "0x7c06838", - "0x1e76d006", - "0x480dd1f8", - "0x60412100", - "0xbdf84608", - "0xf801f000", - "0x480ce7f2", - "0x6006840", - "0xd00b0e00", - "0x6849490a", - "0xd0072900", - "0x4a0a4909", - "0xd00007c3", - "0x1d09600a", - "0xd1f90840", - "0x4770", - "0x4001e500", - "0x4001e400", - "0x10001000", - "0x40010400", - "0x40010500", - "0x40010600", - "0x6e524635", - "0x0" - ], - "load_address": "0x20000000", - "min_program_length": "0x4", - "page_buffers": [ - "0x20002000", - "0x20002400" - ], - "pc_eraseAll": "0x20000029", - "pc_erase_sector": "0x20000049", - "pc_init": "0x20000021", - "pc_program_page": "0x20000071", - "static_base": "0x20000170" - }, - "memory_map": [ - { - "blocksize": "0x400", - "end": "0x3ffff", - "length": "0x40000", - "name": "flash", - "start": "0x0", - "type": "flash" - }, - { - "blocksize": "0x100", - "end": "0x100010ff", - "length": "0x100", - "name": "flash", - "start": "0x10001000", - "type": "flash" - }, - { - "blocksize": "0x0", - "end": "0x20003fff", - "length": "0x4000", - "name": "ram", - "start": "0x20000000", - "type": "ram" - } - ], - "target_name": "nrf51" - }, - "1101": { - "flash_algo": { - "analyzer_address": "0x20004000", - "analyzer_supported": true, - "begin_data": "0x20002000", - "begin_stack": "0x20001000", - "instructions": [ - "0xe00abe00", - "0x62d780d", - "0x24084068", - "0xd3000040", - "0x1e644058", - "0x1c49d1fa", - "0x2a001e52", - "0x4770d1f2", - "0x47702000", - "0x47702000", - "0x4c26b570", - "0x60602002", - "0x60e02001", - "0x68284d24", - "0xd00207c0", - "0x60602000", - "0xf000bd70", - "0xe7f6f82c", - "0x4c1eb570", - "0x60612102", - "0x4288491e", - "0x2001d302", - "0xe0006160", - "0x4d1a60a0", - "0xf81df000", - "0x7c06828", - "0x2000d0fa", - "0xbd706060", - "0x4605b5f8", - "0x4813088e", - "0x46142101", - "0x4f126041", - "0xc501cc01", - "0x7c06838", - "0x1e76d006", - "0x480dd1f8", - "0x60412100", - "0xbdf84608", - "0xf801f000", - "0x480ce7f2", - "0x6006840", - "0xd00b0e00", - "0x6849490a", - "0xd0072900", - "0x4a0a4909", - "0xd00007c3", - "0x1d09600a", - "0xd1f90840", - "0x4770", - "0x4001e500", - "0x4001e400", - "0x10001000", - "0x40010400", - "0x40010500", - "0x40010600", - "0x6e524635", - "0x0" - ], - "load_address": "0x20000000", - "min_program_length": "0x4", - "page_buffers": [ - "0x20002000", - "0x20003000" - ], - "pc_eraseAll": "0x20000029", - "pc_erase_sector": "0x20000049", - "pc_init": "0x20000021", - "pc_program_page": "0x20000071", - "static_base": "0x20000170" - }, - "memory_map": [ - { - "blocksize": "0x1000", - "end": "0x7ffff", - "length": "0x80000", - "name": "flash", - "start": "0x0", - "type": "flash" - }, - { - "blocksize": "0x0", - "end": "0x2000ffff", - "length": "0x10000", - "name": "ram", - "start": "0x20000000", - "type": "ram" - } - ], - "target_name": "nrf52" - }, - "1114": { - "flash_algo": { - "analyzer_supported": false, - "begin_data": "0x10000a00", - "begin_stack": "0x10000800", - "instructions": [ - "0xe00abe00", - "0x62d780d", - "0x24084068", - "0xd3000040", - "0x1e644058", - "0x1c49d1fa", - "0x2a001e52", - "0x4770d1f2", - "0x4c0fb5f8", - "0x25002032", - "0x2607444c", - "0x490d60a6", - "0x60206065", - "0x4f0c4449", - "0x91004620", - "0x696047b8", - "0xd10b2800", - "0x203460a6", - "0x60206065", - "0x60e04807", - "0x99004620", - "0x696047b8", - "0xd0002800", - "0xbdf82001", - "0x4", - "0x18", - "0x1fff1ff1", - "0x2ee0", - "0x4d0fb5f8", - "0x444d0b04", - "0x490e606c", - "0x60ac2032", - "0x60284449", - "0x460f4e0c", - "0x47b04628", - "0x28006968", - "0x606cd10b", - "0x60ac2034", - "0x48086028", - "0x463960e8", - "0x47b04628", - "0x28006968", - "0x2001d000", - "0xbdf8", - "0x4", - "0x18", - "0x1fff1ff1", - "0x2ee0", - "0x47700b00", - "0x21004807", - "0x22016301", - "0x63416342", - "0x6b416342", - "0xd0fc07c9", - "0x49036382", - "0x60082002", - "0x47702000", - "0x40048040", - "0x40048000", - "0x4614b5f8", - "0xd10e0005", - "0x68206861", - "0x184068e2", - "0x188968a1", - "0x69211840", - "0x69611840", - "0x69a11840", - "0x42401840", - "0x4e1061e0", - "0x444e0b28", - "0x60702132", - "0x490e6031", - "0x444960b0", - "0x46304f0d", - "0x47b89100", - "0x28006970", - "0x6075d10e", - "0x60b42033", - "0x20ff6030", - "0x60f03001", - "0x61304807", - "0x99004630", - "0x697047b8", - "0xd0002800", - "0xbdf82001", - "0x4", - "0x18", - "0x1fff1ff1", - "0x2ee0", - "0x47702000", - "0x0" - ], - "load_address": "0x10000000", - "min_program_length": "0x400", - "page_size": "0x1000", - "pc_eraseAll": "0x10000021", - "pc_erase_sector": "0x10000071", - "pc_init": "0x100000c5", - "pc_program_page": "0x100000ed", - "static_base": "0x10000168" - }, - "memory_map": [ - { - "blocksize": "0x1000", - "end": "0x7fff", - "length": "0x8000", - "name": "flash", - "start": "0x0", - "type": "flash" - }, - { - "blocksize": "0x0", - "end": "0x10000fff", - "length": "0x1000", - "name": "ram", - "start": "0x10000000", - "type": "ram" - } - ], - "target_name": "lpc11xx_32" - }, - "1120": { - "flash_algo": { - "analyzer_address": "0x20003000", - "analyzer_supported": true, - "begin_data": "0x20002000", - "begin_stack": "0x20001000", - "instructions": [ - "0xe00abe00", - "0x62d780d", - "0x24084068", - "0xd3000040", - "0x1e644058", - "0x1c49d1fa", - "0x2a001e52", - "0x4770d1f2", - "0x47702000", - "0x47702000", - "0x4c26b570", - "0x60602002", - "0x60e02001", - "0x68284d24", - "0xd00207c0", - "0x60602000", - "0xf000bd70", - "0xe7f6f82c", - "0x4c1eb570", - "0x60612102", - "0x4288491e", - "0x2001d302", - "0xe0006160", - "0x4d1a60a0", - "0xf81df000", - "0x7c06828", - "0x2000d0fa", - "0xbd706060", - "0x4605b5f8", - "0x4813088e", - "0x46142101", - "0x4f126041", - "0xc501cc01", - "0x7c06838", - "0x1e76d006", - "0x480dd1f8", - "0x60412100", - "0xbdf84608", - "0xf801f000", - "0x480ce7f2", - "0x6006840", - "0xd00b0e00", - "0x6849490a", - "0xd0072900", - "0x4a0a4909", - "0xd00007c3", - "0x1d09600a", - "0xd1f90840", - "0x4770", - "0x4001e500", - "0x4001e400", - "0x10001000", - "0x40010400", - "0x40010500", - "0x40010600", - "0x6e524635", - "0x0" - ], - "load_address": "0x20000000", - "min_program_length": "0x4", - "page_buffers": [ - "0x20002000", - "0x20002400" - ], - "pc_eraseAll": "0x20000029", - "pc_erase_sector": "0x20000049", - "pc_init": "0x20000021", - "pc_program_page": "0x20000071", - "static_base": "0x20000170" - }, - "memory_map": [ - { - "blocksize": "0x400", - "end": "0x3ffff", - "length": "0x40000", - "name": "flash", - "start": "0x0", - "type": "flash" - }, - { - "blocksize": "0x100", - "end": "0x100010ff", - "length": "0x100", - "name": "flash", - "start": "0x10001000", - "type": "flash" - }, - { - "blocksize": "0x0", - "end": "0x20003fff", - "length": "0x4000", - "name": "ram", - "start": "0x20000000", - "type": "ram" - } - ], - "target_name": "nrf51" - }, - "1200": { - "flash_algo": { - "analyzer_supported": false, - "begin_data": "0x3fff4a00", - "begin_stack": "0x3fff4800", - "instructions": [ - "0xe00abe00", - "0x62d780d", - "0x24084068", - "0xd3000040", - "0x1e644058", - "0x1c49d1fa", - "0x2a001e52", - "0x4770d1f2", - "0x4770ba40", - "0x4770bac0", - "0x4770ba40", - "0x4770bac0", - "0xf2402a03", - "0xf0108030", - "0xf0000c03", - "0xf8118015", - "0xf1bc3b01", - "0x44620f02", - "0xf811bf98", - "0xf800cb01", - "0xbf383b01", - "0x3b01f811", - "0x204f1a2", - "0xf800bf98", - "0xbf38cb01", - "0x3b01f800", - "0x303f011", - "0x8025f000", - "0xf0c03a08", - "0xf8518008", - "0x3a083b04", - "0xcb04f851", - "0x1008e8a0", - "0x1d12e7f5", - "0xf851bf5c", - "0xf8403b04", - "0xf3af3b04", - "0x7d28000", - "0xf811bf24", - "0xf8113b01", - "0xbf48cb01", - "0x2b01f811", - "0xf800bf24", - "0xf8003b01", - "0xbf48cb01", - "0x2b01f800", - "0xb5104770", - "0xf0c03a20", - "0xe8b1800b", - "0x3a205018", - "0x5018e8a0", - "0x5018e8b1", - "0x5018e8a0", - "0xaff5f4bf", - "0x7c02ea5f", - "0xe8b1bf24", - "0xe8a05018", - "0xbf445018", - "0xc018c918", - "0x4010e8bd", - "0x7c82ea5f", - "0xf851bf24", - "0xf8403b04", - "0xbf083b04", - "0x7d24770", - "0xf831bf28", - "0xbf483b02", - "0x2b01f811", - "0xf820bf28", - "0xbf483b02", - "0x2b01f800", - "0x20004770", - "0x4770", - "0xb5104803", - "0xf0004478", - "0x2000f8b5", - "0xbd10", - "0x390", - "0x9800b501", - "0x5f00f5b0", - "0x2001bf3c", - "0xf410bd08", - "0x466a1f80", - "0x102f04f", - "0x4804bf1c", - "0xbf044478", - "0x44784803", - "0xf80ef000", - "0xbd082000", - "0x370", - "0x35e", - "0x69c14770", - "0xf01f011", - "0x69c0bf18", - "0x4770", - "0x4c44b410", - "0xc110f8df", - "0xd27f2906", - "0xf001e8df", - "0x562a037e", - "0x6801704a", - "0x1f80f411", - "0xf44fbf14", - "0xf44f1181", - "0x68425100", - "0x684160d1", - "0x6801610c", - "0x1f80f411", - "0xbf146841", - "0xc018f8c1", - "0xc014f8c1", - "0x68422102", - "0x68016091", - "0xf4116840", - "0xd0041f80", - "0xf0116801", - "0xd1fb0f02", - "0x6801e058", - "0xf01f011", - "0xe053d1fb", - "0x68426811", - "0x68026114", - "0x1f80f412", - "0xbf146842", - "0xc018f8c2", - "0xc014f8c2", - "0x60d16842", - "0x21016842", - "0x68016091", - "0xf4116840", - "0xd0041f80", - "0xf0116801", - "0xd1fb0f02", - "0x6801e038", - "0xf01f011", - "0xe033d1fb", - "0x68406801", - "0x1f80f411", - "0xbf146841", - "0x101f041", - "0x102f041", - "0xe0276041", - "0xf4116801", - "0x68411f80", - "0xbf14684a", - "0x201f022", - "0x202f022", - "0x6801604a", - "0xf4116840", - "0xd0041f80", - "0xf0116801", - "0xd1fb0f02", - "0x6801e012", - "0xf01f011", - "0xe00dd1fb", - "0x68406801", - "0x1f80f411", - "0x6801d004", - "0xf02f011", - "0xe003d1fb", - "0xf0116801", - "0xd1fb0f01", - "0x2001bc10", - "0x4770", - "0xbb781ae9", - "0xb56d9099", - "0xf4116801", - "0x68411f80", - "0xf44fbf14", - "0xf44f1281", - "0x60ca5200", - "0x49076842", - "0x68016111", - "0xf4116842", - "0x49051f80", - "0x6191bf14", - "0x21026151", - "0x60816840", - "0x4770", - "0xbb781ae9", - "0xb56d9099", - "0x4a086843", - "0x6802611a", - "0xf4126843", - "0x4a061f80", - "0x619abf14", - "0x6842615a", - "0x684060d1", - "0x60812101", - "0x4770", - "0xbb781ae9", - "0xb56d9099", - "0x68406801", - "0x1f80f411", - "0xbf146841", - "0x101f041", - "0x102f041", - "0x47706041", - "0x68406801", - "0x1f80f411", - "0xbf146841", - "0x101f021", - "0x102f021", - "0x47706041", - "0x1e5b6808", - "0xf810d305", - "0xf802cb01", - "0x1e5bcb01", - "0x6008d2f9", - "0x47702001", - "0x68406801", - "0x1f80f411", - "0x6801d004", - "0xf02f011", - "0x4770d1fb", - "0xf0116801", - "0xd1fb0f01", - "0x4770", - "0x49056842", - "0x68016111", - "0xf4116840", - "0x49031f80", - "0x6181bf14", - "0x47706141", - "0xbb781ae9", - "0xb56d9099", - "0x4614b510", - "0x68084602", - "0x5f00f5b0", - "0x10af3c0", - "0xb131d20b", - "0xc0af3c0", - "0x6100f5cc", - "0xd905428b", - "0xf5b3e00a", - "0xd8076f00", - "0xb139e00b", - "0xc0af3c0", - "0x6100f5cc", - "0xd904428b", - "0xbd102000", - "0x6f00f5b3", - "0xf8d2d8fa", - "0xf8dcc004", - "0xf0411004", - "0xf8cc0140", - "0xf8d21004", - "0x4908c004", - "0x1010f8cc", - "0x68526811", - "0x1f80f411", - "0xbf144905", - "0x61516191", - "0x4621461a", - "0xfe1af7ff", - "0xbd102001", - "0xbb781ae9", - "0xb56d9099", - "0xb5104916", - "0xf422690a", - "0x610a0200", - "0x22e0f04f", - "0xf8c2211f", - "0xf8c21180", - "0x4a111280", - "0x6120f04f", - "0xf4106011", - "0xf04f1f80", - "0xf04f0200", - "0xd0080103", - "0x4478480c", - "0xfe9ef7ff", - "0x2200480b", - "0x44782104", - "0x480ae007", - "0xf7ff4478", - "0x4808fe95", - "0x21042200", - "0xf7ff4478", - "0x2000fe8f", - "0xbd10", - "0x4001b000", - "0xe000ed04", - "0x8a", - "0x72", - "0x6c", - "0x9800b507", - "0x5f00f5b0", - "0x460bd310", - "0x1f80f410", - "0xbf1c4669", - "0x44784807", - "0x4807bf04", - "0xf7ff4478", - "0x2801ff77", - "0x2000bf02", - "0xbd00b003", - "0xb0032001", - "0xbd00", - "0x36", - "0x24", - "0x47702000", - "0x47702000", - "0x0", - "0x40017000", - "0x8", - "0x100000", - "0x40017000", - "0x8", - "0x0", - "0x0", - "0x0", - "0x0" - ], - "load_address": "0x3fff4000", - "min_program_length": "0x800", - "page_size": "0x800", - "pc_eraseAll": "0x3fff4125", - "pc_erase_sector": "0x3fff4139", - "pc_init": "0x3fff4409", - "pc_program_page": "0x3fff4479", - "pc_uninit": "0x3fff44b5", - "pc_verify": "0x3fff44b9", - "static_base": "0x3fff44d4" - }, - "memory_map": [ - { - "blocksize": "0x800", - "end": "0x51fff", - "length": "0x50000", - "name": "flash", - "start": "0x2000", - "type": "flash" - }, - { - "blocksize": "0x0", - "end": "0x3fffffff", - "length": "0xc000", - "name": "ram", - "start": "0x3fff4000", - "type": "ram" - } - ], - "target_name": "ncs36510" - }, - "1234": { - "flash_algo": { - "analyzer_address": "0x10002000", - "analyzer_supported": true, - "begin_data": "0x2007c000", - "begin_stack": "0x10001000", - "instructions": [ - "0xe00abe00", - "0x62d780d", - "0x24084068", - "0xd3000040", - "0x1e644058", - "0x1c49d1fa", - "0x2a001e52", - "0x4770d1f2", - "0x7803e005", - "0x42931c40", - "0x2001d001", - "0x1e494770", - "0x2000d2f7", - "0x4770", - "0x28100b00", - "0x210ed302", - "0xd0eb01", - "0x486c4770", - "0x7801b510", - "0x102f021", - "0x22aa7001", - "0x23557302", - "0x78017303", - "0x101f021", - "0x73027001", - "0xf8d07303", - "0xf0411120", - "0xf8c00120", - "0xf1a01120", - "0xf8d00080", - "0x64911a0", - "0xf100d5fb", - "0x24010080", - "0x408cf880", - "0x113f04f", - "0x73026041", - "0x78017303", - "0x101f041", - "0x73027001", - "0xf1a07303", - "0xf8d00080", - "0x1491088", - "0xf100d5fb", - "0x2107006d", - "0x1097f880", - "0x109f04f", - "0x109bf880", - "0xf0417cc1", - "0x74c10102", - "0x77c377c2", - "0x4c2df800", - "0xf64e494b", - "0x44492060", - "0xf04f6008", - "0xbd100000", - "0x47702000", - "0x41f0e92d", - "0x20324c46", - "0x2500444c", - "0xe884271d", - "0xf10400a1", - "0x4e430114", - "0x46204688", - "0x696047b0", - "0x2034b960", - "0xa1e884", - "0x4641483c", - "0x68004448", - "0x462060e0", - "0x696047b0", - "0xd0002800", - "0xe8bd2001", - "0xe92d81f0", - "0xf7ff41f0", - "0x4d35ff87", - "0x444d4604", - "0xe9c52032", - "0xf1050400", - "0x4e320114", - "0x4628460f", - "0x47b060ac", - "0xb9686968", - "0xe9c52034", - "0x482b0400", - "0x444860ac", - "0x68004639", - "0x462860e8", - "0x696847b0", - "0xd0dc2800", - "0xe7da2001", - "0x41f0e92d", - "0x46140006", - "0x4925d11d", - "0x2fcf8d4", - "0xd03a4288", - "0x42884923", - "0x4923d037", - "0xd0344288", - "0x4131ea4f", - "0xd0304288", - "0x100e9d4", - "0xe9d44408", - "0x44111202", - "0x69214408", - "0x69614408", - "0x69a14408", - "0x42404408", - "0x463061e0", - "0xff42f7ff", - "0x21324d12", - "0x4f12444d", - "0x1000e9c5", - "0x114f105", - "0x468860a8", - "0x47b84628", - "0xb9806968", - "0xe9c52033", - "0xf44f0600", - "0xe9c56080", - "0x48074002", - "0x44484641", - "0x61286800", - "0x47b84628", - "0x28006968", - "0x2001d095", - "0xe793", - "0x400fc080", - "0x4", - "0x8", - "0x1fff1ff1", - "0x4e697370", - "0x12345678", - "0x87654321", - "0x0", - "0x0" - ], - "load_address": "0x10000000", - "min_program_length": "0x100", - "pc_eraseAll": "0x100000e1", - "pc_erase_sector": "0x10000123", - "pc_init": "0x10000047", - "pc_program_page": "0x10000169", - "static_base": "0x10000214" - }, - "memory_map": [ - { - "blocksize": "0x1000", - "end": "0xffff", - "length": "0x10000", - "name": "flash", - "start": "0x0", - "type": "flash" - }, - { - "blocksize": "0x8000", - "end": "0x7ffff", - "length": "0x70000", - "name": "flash", - "start": "0x10000", - "type": "flash" - }, - { - "blocksize": "0x0", - "end": "0x10007fff", - "length": "0x8000", - "name": "ram", - "start": "0x10000000", - "type": "ram" - }, - { - "blocksize": "0x0", - "end": "0x20083fff", - "length": "0x8000", - "name": "ram", - "start": "0x2007c000", - "type": "ram" - } - ], - "target_name": "lpc1768" - }, - "1600": { - "flash_algo": { - "analyzer_address": "0x10005000", - "analyzer_supported": false, - "begin_data": "0x10004000", - "begin_stack": "0x10008000", - "instructions": [ - "0xe00abe00", - "0x62d780d", - "0x24084068", - "0xd3000040", - "0x1e644058", - "0x1c49d1fa", - "0x2a001e52", - "0x4770d1f2", - "0x4770ba40", - "0x4770bac0", - "0xb5104935", - "0x22004449", - "0x604a600a", - "0x608a4a33", - "0x32fff04f", - "0x220860ca", - "0x4931610a", - "0x60084449", - "0x48304931", - "0x49316708", - "0x600820f3", - "0x610820d3", - "0x608860c8", - "0x20136048", - "0x48276148", - "0x4448230c", - "0x210322c0", - "0xf0003880", - "0x2800fb23", - "0x2001d000", - "0x2000bd10", - "0x48204770", - "0x44482100", - "0xf1a06001", - "0x68890180", - "0x491d6041", - "0x21046081", - "0x46016101", - "0xf0013880", - "0x491ab890", - "0x4449b510", - "0x1a416809", - "0x44484815", - "0xf44f6001", - "0x60415180", - "0x60814913", - "0x61012120", - "0x38804601", - "0xf87df001", - "0xd0002800", - "0xbd102001", - "0x4a0e4613", - "0x444ab510", - "0x1a826812", - "0x44484809", - "0x2100e9c0", - "0x60814908", - "0x60c12100", - "0x61012108", - "0x46194602", - "0xf0003880", - "0x2800ff3e", - "0x2001d000", - "0xbd10", - "0x88", - "0x10080000", - "0x4", - "0x1000800", - "0x40050000", - "0x4008618c", - "0x604849f9", - "0xc800480", - "0x2801d006", - "0x2802d008", - "0x2803d008", - "0x6948d008", - "0x79269ca", - "0x4770d4fc", - "0xe7f97d08", - "0xe7f78a88", - "0x7d0a8a88", - "0x4002ea40", - "0xb510e7f2", - "0x1400f44f", - "0x5141eb04", - "0x6000ea41", - "0x4002ea40", - "0xbd104318", - "0x3406a80", - "0xf44fd502", - "0x477010c0", - "0x47702000", - "0x4604b510", - "0x46084613", - "0x46112200", - "0xffe5f7ff", - "0x46204601", - "0xffecf7ff", - "0x4010e8bd", - "0xe7c34308", - "0xb5004bdb", - "0xf7ff609a", - "0x4308ffe3", - "0xeb04f85d", - "0xb530e7ba", - "0x46054cd6", - "0x46114608", - "0x230060a3", - "0xf7ff461a", - "0x4601ffca", - "0xf7ff4628", - "0x4301ffd1", - "0x69e06061", - "0xd4fc0780", - "0x2200bd30", - "0xe7cf2106", - "0x460db5f0", - "0x461f4616", - "0xf7ff4604", - "0x463bfff6", - "0x46294632", - "0xe8bd4620", - "0xe7da40f0", - "0x460db5f0", - "0x461c4616", - "0xf7ff4607", - "0x49c1ffe8", - "0x4638608e", - "0xffaef7ff", - "0xf4404328", - "0x60484000", - "0xc8004a8", - "0x2801d007", - "0xb2a2d00b", - "0xd00a2802", - "0xd0042803", - "0x69c8614c", - "0xd4fc0780", - "0x828abdf0", - "0x750c0c24", - "0x828ae7f7", - "0x49b2e7f5", - "0xf01369cb", - "0xd0190f06", - "0x61ca2210", - "0xf01269ca", - "0xd1fb0f16", - "0xd511075a", - "0xf40269c2", - "0xf5b20260", - "0xd30b0f40", - "0x730a22ff", - "0xf36f69c0", - "0xf100000f", - "0x60480001", - "0x69c87d08", - "0xd4fc0780", - "0xe92d4770", - "0x460541f0", - "0x46882400", - "0x21017cea", - "0xf102fa01", - "0x46204f9d", - "0x69f9b2ce", - "0xd4fc0789", - "0x6c20f644", - "0x45641c64", - "0x2201d207", - "0x46282105", - "0xff64f7ff", - "0x4230b2c0", - "0x4230d0f4", - "0x75284e94", - "0xea5fd00a", - "0xd00c0008", - "0xd00c2801", - "0xd0062802", - "0xf03f1b8", - "0xe008d10b", - "0xe8bd4630", - "0x4c8d81f0", - "0x4c8de005", - "0x4c8de003", - "0xf04fe001", - "0x462834ff", - "0xff3cf7ff", - "0x4308498a", - "0x43087ce9", - "0x69f86078", - "0xd5020780", - "0xd1fa1e64", - "0xb1ece01e", - "0x75287d38", - "0xf00f1b8", - "0x6ae8d01e", - "0xb2c1b1e0", - "0xd0172905", - "0x46282201", - "0xff2af7ff", - "0x7568b2c0", - "0xea106ae9", - "0xd00f2f11", - "0x4107f3c1", - "0x2200b119", - "0xf7ff4628", - "0x4873ff1d", - "0xe7c81c80", - "0xf7ff4628", - "0xe7c3ff7a", - "0xe7eb7d28", - "0xe7c02000", - "0x4615b530", - "0x460b4604", - "0x46112200", - "0xf7ff2001", - "0x4601fef6", - "0x2200462b", - "0xf7ff4620", - "0x6aa0ff41", - "0xd5010480", - "0xbd302000", - "0xe8bd4620", - "0x21004030", - "0xb5f0e77b", - "0x69c44605", - "0x26a66a80", - "0xd50b0581", - "0x120f404", - "0xf00f5b1", - "0xf444d106", - "0x61ec1400", - "0xf4416a29", - "0x62291100", - "0xd5180681", - "0xd5010540", - "0xe0002702", - "0x1d3f2701", - "0x21852201", - "0xf7ff4628", - "0xf000fed9", - "0x69e80307", - "0x110f1c7", - "0x20e0f400", - "0x430340c8", - "0x21812201", - "0xf7ff4628", - "0x6aa8fefb", - "0xd00707c0", - "0x22032300", - "0x462821a3", - "0xfedbf7ff", - "0xd1fd1e76", - "0x5142f3c4", - "0x29064842", - "0x21a5d304", - "0xf4247301", - "0xe0010440", - "0x730121ff", - "0xbdf06184", - "0x4604b510", - "0x6006a80", - "0x2201d511", - "0x4620212b", - "0xfea8f7ff", - "0x6aa17560", - "0xf4210600", - "0xd5023170", - "0x3080f44f", - "0xf44fe001", - "0x43014080", - "0xbd1062a1", - "0x2300b530", - "0x84836381", - "0x84c32307", - "0x8c83e010", - "0x442388cc", - "0x790b8483", - "0x88cd8cc4", - "0xd00107db", - "0xe0002302", - "0xfb052301", - "0x31084303", - "0x3a0884c3", - "0xd2ec2a08", - "0x1ccf3c3", - "0xbd3084c1", - "0xb1226b82", - "0x8c82b109", - "0x8cc0800a", - "0xb1114770", - "0xc126882", - "0x6880800a", - "0x47700cc0", - "0x4604b510", - "0x33cf100", - "0xf7ff2100", - "0x1ffeb", - "0x6aa0d01f", - "0x7080f440", - "0x462062a0", - "0xfe56f7ff", - "0x201ea40", - "0x43024817", - "0x60424810", - "0x7d02e002", - "0x2b01f803", - "0xf1a1000a", - "0xb2890101", - "0x2100d1f7", - "0x42a33480", - "0xf803d202", - "0xe7fa1b01", - "0x78969c1", - "0xbd10d4fc", - "0x22011c49", - "0xf04f408a", - "0x60826100", - "0xd900428a", - "0x60c2460a", - "0x4770", - "0x40003000", - "0x20003", - "0x38270", - "0x419ce0", - "0xa408300", - "0x5204000", - "0x72200000", - "0x41f0e92d", - "0x460d4604", - "0x49fe69c0", - "0x46984616", - "0xd06e4288", - "0x62a54620", - "0xff6af7ff", - "0xf1b068a0", - "0xd9197f80", - "0xf4406aa0", - "0x62a07000", - "0x28017c20", - "0x2820d006", - "0x28c2d00b", - "0xf04fd009", - "0xe6b81002", - "0x22012380", - "0x46202117", - "0xfe1df7ff", - "0x2200e004", - "0x462021b7", - "0xfdfef7ff", - "0xd5040568", - "0x680148ea", - "0x5180f041", - "0x4fe96001", - "0xd5240768", - "0x21352201", - "0xf7ff4620", - "0xb2c0fdef", - "0x7817560", - "0x7c0d455", - "0x2201d135", - "0x46202105", - "0xfde4f7ff", - "0xf0417d61", - "0xea400102", - "0xb2822001", - "0x46202102", - "0xfec8f7ff", - "0xd1cc2800", - "0x21352201", - "0xf7ff4620", - "0x7560fdd3", - "0x7080ea4f", - "0x4e8e019", - "0x2201d51c", - "0x46202105", - "0xfdc8f7ff", - "0x7520b2c0", - "0xd42e0641", - "0x240f040", - "0x46202101", - "0xfeacf7ff", - "0xd1b02800", - "0x21052201", - "0xf7ff4620", - "0x7520fdb7", - "0x28000640", - "0x4638db1d", - "0xe04ee65f", - "0xd5180728", - "0x213f2201", - "0xf7ff4620", - "0xb2c0fda9", - "0x6017560", - "0xf040d40f", - "0x22010380", - "0x4620213e", - "0xfdcef7ff", - "0x213f2201", - "0xf7ff4620", - "0x7560fd99", - "0x6000ea4f", - "0x7a8e7df", - "0x2200d505", - "0x46202138", - "0xfd8ef7ff", - "0x6e8e017", - "0x568d515", - "0x2740d501", - "0x2780e000", - "0x21652201", - "0xf7ff4620", - "0xb2c0fd81", - "0x42387560", - "0xf040d007", - "0x43bb03c8", - "0x21612201", - "0xf7ff4620", - "0xf3c6fda5", - "0x280340c1", - "0xd0106aa0", - "0x2080f420", - "0x52862a0", - "0xf3c6d507", - "0x1e5b4302", - "0x21c02201", - "0xf7ff4620", - "0xe9c4fd7c", - "0x20006807", - "0xf440e60d", - "0xe7ed2080", - "0x41f0e92d", - "0x46044e99", - "0x69b0460f", - "0x46984615", - "0xf40f410", - "0x4601d04d", - "0x40c1f3c0", - "0x280361e1", - "0x2000d04a", - "0x462062a0", - "0xfda9f7ff", - "0x21ff2200", - "0xf7ff4620", - "0x2200fd41", - "0x46112301", - "0xf7ff2065", - "0xf440fd28", - "0xf7ff10c0", - "0xf1a0fd0b", - "0x29800140", - "0x681d208", - "0xf040d406", - "0x220103c0", - "0x46202161", - "0xfd5af7ff", - "0x46202180", - "0xfcbff001", - "0xc1f005", - "0xd02428c1", - "0x2170f44f", - "0x4107ea01", - "0x50c0ea41", - "0x71fff64f", - "0x60304408", - "0x219f2203", - "0xf7ff4620", - "0xf04ffd13", - "0x61204100", - "0x1600e9c4", - "0xf06fb130", - "0x4288417f", - "0x4973d002", - "0xd10b4288", - "0x1d404870", - "0xf440e5b1", - "0xe7af0140", - "0x2080f44f", - "0x486ce7b2", - "0xe5a81e40", - "0x4080f44f", - "0x201c62a0", - "0x209c8360", - "0x4f658320", - "0xd50107a8", - "0xe0004638", - "0xf8444866", - "0x48660f1c", - "0x20206060", - "0x200c7620", - "0x20d87520", - "0x201076a0", - "0xf81475a0", - "0xf1a40c0c", - "0x287f041c", - "0xdc0cd029", - "0xd01d281f", - "0x2801dc04", - "0x281cd014", - "0xe014d139", - "0xd0182820", - "0xd1342837", - "0x28c2e018", - "0xdc04d022", - "0xd019288c", - "0xd12c28bf", - "0x28c8e019", - "0x28efd01d", - "0xe01dd127", - "0x447b4b51", - "0x4b51e01c", - "0xe019447b", - "0x447b4b50", - "0x4b50e016", - "0xe013447b", - "0x447b4b4f", - "0x4b4fe010", - "0xe00d447b", - "0x447b4b4e", - "0x4b4ee00a", - "0xe007447b", - "0x447b4b4d", - "0x4b4de004", - "0xe001447b", - "0x447b4b4c", - "0x4642b12b", - "0x46204629", - "0x46064798", - "0x4e3ae001", - "0xb3061d36", - "0x61e72500", - "0xf0014628", - "0x2103fb1a", - "0x22002301", - "0xf7ff4608", - "0x4601fc78", - "0x46202200", - "0xfc96f7ff", - "0xb10d4601", - "0xe00020ff", - "0x42812000", - "0x1c6dd102", - "0xdbe72d02", - "0xd10a2d02", - "0xf4406aa0", - "0x62a07000", - "0x6aa0e005", - "0xd5020400", - "0xf7ff4620", - "0x4620fe01", - "0xfd73f7ff", - "0xe5184630", - "0x4dffe92d", - "0x4683b08a", - "0x90032000", - "0x68c6980b", - "0xf7ff4658", - "0x4658fcc2", - "0xfdaaf7ff", - "0x8028f8db", - "0x4048ea5f", - "0xf8bbd576", - "0xf0080018", - "0xf4000104", - "0x4308407f", - "0x2001d000", - "0x22014682", - "0x46582105", - "0xfc48f7ff", - "0x14f88b", - "0xaea5f", - "0x2201d004", - "0x46582135", - "0xfc3ef7ff", - "0x15f88b", - "0x4014f8bb", - "0xd0311c70", - "0xf8bbb16e", - "0xea240018", - "0x40300200", - "0xf10a4302", - "0xb2c10001", - "0xf7ff4658", - "0x9003fd19", - "0xe02ce067", - "0x3803fff", - "0x40003000", - "0x20005", - "0xcccccc", - "0xb813fff", - "0x2808000", - "0x13e1", - "0xe51", - "0xc57", - "0x1243", - "0xbab", - "0xd5d", - "0xeef", - "0x1461", - "0x104f", - "0xf99", - "0x1529", - "0x7800980c", - "0x980db310", - "0xf8bb8802", - "0x4002001a", - "0x43224384", - "0xf8bbe7c9", - "0x4220001a", - "0x990cd037", - "0x25002001", - "0x980d7008", - "0xf10a8004", - "0xb2c70001", - "0x1af8bb", - "0xea244639", - "0x46580200", - "0xfcd4f7ff", - "0xb1209003", - "0x2d031c6d", - "0xe189dbf2", - "0x20a6e01f", - "0xd1fd1e40", - "0x21052201", - "0xf7ff4658", - "0xf88bfbd7", - "0xea5f0014", - "0xd004000a", - "0x21352201", - "0xf7ff4658", - "0xf88bfbcd", - "0xf8bb0015", - "0xf8bb0014", - "0x4208101a", - "0x48f9d002", - "0xe16b9003", - "0x28009803", - "0xf418d1dd", - "0xd0da3f60", - "0xf8db2000", - "0x46045038", - "0x20019006", - "0xb10e9008", - "0xe00020ff", - "0x90092000", - "0x90002000", - "0xf44f980b", - "0xe9d03780", - "0x44081000", - "0xf10b9002", - "0x4682003c", - "0xf8db9005", - "0xa907001c", - "0x5040f3c0", - "0x90011cc0", - "0xf7ff4658", - "0x9004fd1d", - "0xf8bdb915", - "0x9006001c", - "0x4008ea5f", - "0xea5fd505", - "0xd40250c8", - "0xf7ff4658", - "0x1c70fd1d", - "0xb1b6d001", - "0x980ce104", - "0xb1587800", - "0x4008ea5f", - "0xe9ddd5f8", - "0x990d2004", - "0xfa9ef001", - "0xf8ad2000", - "0xe0f5001c", - "0xf7ff4658", - "0x2000fc7c", - "0xe8bdb00e", - "0x990c8df0", - "0x70082000", - "0x4008ea5f", - "0xe9ddd5e2", - "0x980d2104", - "0xfa88f001", - "0x9806e0e2", - "0x88e8bb28", - "0x68289006", - "0xf9959000", - "0x28000005", - "0x4240da00", - "0x40872701", - "0x7c07928", - "0x1b0d021", - "0x1006ea40", - "0x86ea40", - "0xb2c04330", - "0x20029009", - "0x2c409008", - "0x2c10d00c", - "0x2c04d00a", - "0x2c01d008", - "0x2c20d006", - "0x2c08d00a", - "0x2c02d008", - "0xe017d006", - "0xf7ff4658", - "0xf04ffc40", - "0xe7c11002", - "0x454ea44", - "0xb10ee00e", - "0xe00020ff", - "0x90092000", - "0x90082001", - "0xd0032c30", - "0xd0012c0c", - "0xd1012c03", - "0x444ea04", - "0xb125b934", - "0x7c07928", - "0x24c0d001", - "0x2480e000", - "0x6801980b", - "0x44389800", - "0xd2784281", - "0x98029900", - "0xd9744288", - "0x3f40f418", - "0x1c70d063", - "0x2e00d00b", - "0xea5fdd1b", - "0xd50b30c8", - "0x2136460b", - "0x9a014658", - "0xfb32f7ff", - "0xf89ae04e", - "0x42200000", - "0xe049d1f1", - "0x22002301", - "0x990120e5", - "0xfae3f7ff", - "0x23014601", - "0x9a004658", - "0xfb2ef7ff", - "0xd13be03c", - "0x30c8ea5f", - "0x203cd501", - "0x20e8e000", - "0x22002301", - "0xf7ff9901", - "0x4601fad0", - "0x9a004658", - "0xfaeef7ff", - "0xea5fb2c0", - "0xd5023188", - "0x78943c1", - "0x7c0d00b", - "0xea5fd025", - "0xd50b30c8", - "0x3200e9dd", - "0x46582139", - "0xfafcf7ff", - "0x4658e010", - "0xfbcff7ff", - "0xe751487a", - "0x22002301", - "0x990120e5", - "0xfaadf7ff", - "0x23004601", - "0x9a004658", - "0xfaf8f7ff", - "0x2001990c", - "0xf89a7008", - "0x43200000", - "0xf88a", - "0xbbe89803", - "0xf89ae011", - "0x43a00000", - "0xf89ae7f6", - "0x99092000", - "0x4ea22", - "0x43084021", - "0xd0044282", - "0xf88a", - "0x2001990c", - "0x98087008", - "0xd10140c4", - "0xa01f10a", - "0xf995b135", - "0x28000005", - "0xf1c7da02", - "0xe0000000", - "0x99004638", - "0x90004408", - "0xf1a09806", - "0x4000001", - "0x90060c00", - "0xb10dd102", - "0x508f105", - "0x1cf8bd", - "0x101f1a0", - "0x101cf8ad", - "0xf47f2800", - "0x980caf14", - "0xb1187800", - "0x4008ea5f", - "0xe000d51c", - "0x4658e01a", - "0xfa9bf7ff", - "0x99054658", - "0xfa62f7ff", - "0x43109a04", - "0x43104a4b", - "0x60504a4b", - "0xf811e002", - "0x75100b01", - "0xf1a09804", - "0xb29b0301", - "0x28009304", - "0x69d0d1f5", - "0xd4fc0780", - "0xf7ff4658", - "0x9803fb5a", - "0xb570e6dc", - "0x6886680a", - "0x6803b1ce", - "0xd8064293", - "0x684d68c4", - "0x4415441c", - "0xd30042ac", - "0x42961ad2", - "0x684bd910", - "0x42b34413", - "0x690cd80c", - "0xf30f014", - "0x68c0d002", - "0xd8054283", - "0x600a2000", - "0x4830bd70", - "0xbd701c80", - "0x1e40482e", - "0xb570bd70", - "0x4615460c", - "0xf7ff4606", - "0x4630fa8a", - "0xfa51f7ff", - "0x608d492a", - "0xf7ff4630", - "0x6a32fa17", - "0x260f402", - "0x6204ea42", - "0x60484310", - "0xd0072cc7", - "0xd0052c60", - "0x46302101", - "0x4070e8bd", - "0xba91f7ff", - "0xe7f82103", - "0x460db570", - "0x46044616", - "0xfa33f7ff", - "0x6085481b", - "0x43316a21", - "0xbd706041", - "0x4df0e92d", - "0x460e4683", - "0x46984617", - "0xf8df681c", - "0x6855a054", - "0x693be067", - "0xb2d0683a", - "0x7480f5c0", - "0x42a5b113", - "0x462cd200", - "0xe0024621", - "0x1e6d1c76", - "0x7b01e64", - "0x7830d009", - "0xd11828ff", - "0x2c00b1f5", - "0xe01bd1f4", - "0x1f2d1d36", - "0x68301f24", - "0xd10e1c40", - "0xd30c2d04", - "0xd2f52c04", - "0xe00a", - "0x20005", - "0x42208000", - "0x40003000", - "0x1e6d1c76", - "0xb12d1e64", - "0x2c04b124", - "0x7830d202", - "0xd0f528ff", - "0x44101b08", - "0xb3956038", - "0xd0c72c00", - "0x46224601", - "0xf7ff4658", - "0x6838ffab", - "0x60384420", - "0x2c00e001", - "0x4650d0bb", - "0xd00b07b1", - "0xb14cb1c5", - "0x1b01f816", - "0x1e6d7501", - "0xe7f51e64", - "0x6141ce02", - "0x1f241f2d", - "0xd3072d04", - "0xd2f72c04", - "0xf816e005", - "0x75011b01", - "0x1e641e6d", - "0x2c00b115", - "0xe000d1f7", - "0x2102b92c", - "0xf7ff4658", - "0x2800fa12", - "0x2d00d104", - "0x2000d1d7", - "0x4000f8c8", - "0x6800e613", - "0xe0044408", - "0x1c496801", - "0x1d00d104", - "0x2a001f12", - "0x2000d1f8", - "0x68134770", - "0x44186800", - "0x40486010", - "0xd0010780", - "0x47702000", - "0x47702001", - "0x460cb53f", - "0xaa02461d", - "0xffeff7ff", - "0xb948b335", - "0x9802e022", - "0x1b01f814", - "0x42917802", - "0x1c40d11f", - "0x90021e6d", - "0xd00b07a0", - "0xd1f22d00", - "0x9802e016", - "0x68026821", - "0xd1124291", - "0x1d241d00", - "0x90021f2d", - "0xd2f42d04", - "0x9802e008", - "0x1b01f814", - "0x42917802", - "0x1c40d105", - "0x90021e6d", - "0xd1f42d00", - "0xb0042000", - "0xb5f8bd30", - "0x6811460c", - "0x68559100", - "0x43de469c", - "0x4621466a", - "0xffb9f7ff", - "0xf00cb385", - "0xb1e803ff", - "0x7a0b2f1", - "0xb34dd018", - "0xf8149f00", - "0xf8170b01", - "0x40582b01", - "0x4210404a", - "0xd11b9700", - "0xe7f01e6d", - "0x68209a00", - "0xea806811", - "0x4071000c", - "0xd1114208", - "0x1d241d12", - "0x92001f2d", - "0xd2f12d04", - "0xb16db2f1", - "0xf8149e00", - "0xf8160b01", - "0x40582b01", - "0x4210404a", - "0xd0019600", - "0xbdf82001", - "0xe7f01e6d", - "0x2000e7ff", - "0xe92dbdf8", - "0x46174df7", - "0x468bb09d", - "0x46392214", - "0xf001a802", - "0x2500f85c", - "0x5068f88d", - "0x687ca902", - "0xf7ff981d", - "0x6fe9c", - "0x9802d138", - "0x4420901b", - "0x46289018", - "0x69389005", - "0xd4070580", - "0xaa1aab07", - "0x981da902", - "0xfc72f7ff", - "0xd1270006", - "0x981de0b1", - "0xa01f04f", - "0x1030f890", - "0xf001fa0a", - "0x1e429902", - "0xeb004391", - "0x91010801", - "0xeba89902", - "0x42ac0501", - "0x4625d200", - "0x69389503", - "0xd4060740", - "0xaa022300", - "0x981d4659", - "0xff7df7ff", - "0x2001b100", - "0x91199902", - "0xd07d2800", - "0x7006938", - "0x48ead502", - "0xe53cb020", - "0xb30868b8", - "0x1201e9dd", - "0xa01eba2", - "0x46429918", - "0xd2034541", - "0x9a184611", - "0xe0001a89", - "0x46882100", - "0x10aea5f", - "0x460ad005", - "0xf0009901", - "0x9801ffbb", - "0xf1b89002", - "0xd00a0f00", - "0x464268b9", - "0xaeb01", - "0xf0009918", - "0xe002ffaf", - "0x800f04f", - "0x981d46c2", - "0xf8909a01", - "0xf7ff1034", - "0x6fe56", - "0x981dd003", - "0xf985f7ff", - "0x6938e066", - "0xd5100680", - "0xf7ff981d", - "0x981df97e", - "0x99012201", - "0x30f890", - "0x981d4082", - "0xfee7f7ff", - "0xd1b92800", - "0xf7ff981d", - "0x2000f8cc", - "0x90069000", - "0xa00cf8cd", - "0xaa02466b", - "0x981d68b9", - "0xfe5ef7ff", - "0x95034606", - "0xf00f1b8", - "0x2000d003", - "0xb1169006", - "0x2001e008", - "0x466be7fa", - "0x4659aa02", - "0xf7ff981d", - "0x4606fe4d", - "0xf8cd2001", - "0x9006800c", - "0x68b9b966", - "0x4451466b", - "0x981daa02", - "0xfe40f7ff", - "0xd1030006", - "0xb1089800", - "0x1602f04f", - "0xe000981d", - "0xf7ffe056", - "0xb9eef93c", - "0x6c06938", - "0x462bd507", - "0x9a194659", - "0xf7ff981d", - "0x6febb", - "0x44abd112", - "0x2c001b64", - "0xaf4bf47f", - "0xb15868f8", - "0x981b9005", - "0x68789002", - "0xab079003", - "0xa902aa1a", - "0xf7ff981d", - "0x4606fbad", - "0xe7614630", - "0xfff041", - "0x1c6d1a45", - "0xd20042ac", - "0xf04f4625", - "0xaa0233ff", - "0x95034659", - "0xf7ff981d", - "0xb1f0fec6", - "0xf7ff981d", - "0x2000f864", - "0x466b9000", - "0x4659aa02", - "0xa018f8cd", - "0xf7ff981d", - "0x4606fdf7", - "0xf7ff981d", - "0x2e00f8fa", - "0x6938d1da", - "0xd50b06c0", - "0x4659462b", - "0x981d9a19", - "0xfe78f7ff", - "0xd1cf0006", - "0x9802e002", - "0x90024428", - "0x1b6444ab", - "0xd0b92c00", - "0x45419902", - "0xaf01f4bf", - "0xe92de7c4", - "0xb09e4df3", - "0x2214460c", - "0xf000a802", - "0x2600ff38", - "0x606cf88d", - "0x90016860", - "0xf890981e", - "0x20011030", - "0x901a4088", - "0x9618a902", - "0xf7ff981e", - "0x5fd70", - "0x9605d17e", - "0x5806920", - "0xab07d407", - "0xa902aa1b", - "0xf7ff981e", - "0x5fb4b", - "0xe9ddd172", - "0x44080101", - "0x9000911c", - "0xd16c2900", - "0x6881981e", - "0x42819801", - "0x981ed867", - "0x6406a80", - "0x981ed463", - "0xf803f7ff", - "0x461a2300", - "0x981e21c7", - "0xffcaf7fe", - "0x981e2103", - "0xf819f7ff", - "0x981e4605", - "0xf899f7ff", - "0x2703e09f", - "0x4438981e", - "0xf890901d", - "0x28000030", - "0x2101d07e", - "0xf800fa01", - "0xf1a89802", - "0xea200101", - "0xeba00b01", - "0xeb0b060b", - "0x90190008", - "0x42819900", - "0x1a40d201", - "0x2000e000", - "0x981a4682", - "0xd2794286", - "0xd2774582", - "0xb16868a0", - "0x4632b11e", - "0xf0004659", - "0xf1bafe8b", - "0xd0050f00", - "0x465268a0", - "0x99004430", - "0xfe82f000", - "0x465a981e", - "0xf8904438", - "0x981e1034", - "0xfd2bf7ff", - "0x981e4605", - "0xf85bf7ff", - "0xd1702d00", - "0x6806920", - "0x981dd50a", - "0x46592201", - "0x30f890", - "0x981e4082", - "0xfdbff7ff", - "0xd1030005", - "0xb3c068a0", - "0xe0012001", - "0xe048e05e", - "0xb1fe9006", - "0xf7fe981e", - "0xe9cdff9c", - "0xab18b602", - "0x68a1aa02", - "0xf7ff981e", - "0x4605fd31", - "0xf7ff981e", - "0xb925f834", - "0xb1109818", - "0x1502f04f", - "0x6920e045", - "0xd50606c0", - "0x465a4633", - "0x981e68a1", - "0xfdaef7ff", - "0xbbd54605", - "0xf00f1ba", - "0x981ed017", - "0xff79f7fe", - "0xe9cd9800", - "0x68a00a02", - "0x1981ab18", - "0x981eaa02", - "0xfd0cf7ff", - "0xe0014605", - "0xe006e010", - "0xf7ff981e", - "0xbb15f80c", - "0x28009818", - "0x9819d1d6", - "0x98019002", - "0xd90b4540", - "0x8eba0", - "0xe0029001", - "0xf57f1e7f", - "0x9801af65", - "0xf47f2800", - "0xb975af60", - "0xb16068e0", - "0x9002981c", - "0x90036860", - "0x900568e0", - "0xaa1bab07", - "0x981ea902", - "0xfa78f7ff", - "0x46284605", - "0xe62c", - "0x2000b", - "0x41f0e92d", - "0x7c847c46", - "0x460f4605", - "0xd0042e30", - "0xd0072e40", - "0xe8bd481c", - "0xf1a481f0", - "0x28070010", - "0xe009d211", - "0x15f1a4", - "0xd20c2802", - "0x401cf244", - "0xf2448368", - "0x832850fc", - "0x46281e61", - "0xf878f7ff", - "0xd1052e40", - "0x4810e002", - "0xe7e41e40", - "0xd50805f8", - "0xf44f480e", - "0x2c164188", - "0x4b0dd301", - "0x6a2be005", - "0x480ce003", - "0xf2444b0c", - "0x2c160104", - "0x2206d301", - "0x2204e000", - "0x5242ea40", - "0x43024808", - "0xe8bd4628", - "0xf7ff41f0", - "0xb86f", - "0x20008", - "0xbb010000", - "0xa2888000", - "0xeb030000", - "0x32888000", - "0x103fff", - "0x41f0e92d", - "0x7c404605", - "0xf44f460f", - "0x7ca94680", - "0x343f1a0", - "0xb24c3a", - "0x800f04f", - "0xd8252b05", - "0xd140094b", - "0x432f1a0", - "0x28444616", - "0x2845d006", - "0x2846d00b", - "0xf444d33d", - "0xe03a7480", - "0x22204931", - "0x46284479", - "0xffcef7fe", - "0x2901e033", - "0x492dd131", - "0x44792220", - "0x4628310e", - "0xffc4f7fe", - "0x219f2204", - "0xf7fe4628", - "0xe00fe59", - "0xe022d1e5", - "0xd0092865", - "0xd0072866", - "0xd0142886", - "0xd0122887", - "0x1c404820", - "0x81f0e8bd", - "0x456f1a0", - "0xd0082865", - "0x8368206c", - "0x80f040", - "0x20008328", - "0x32f885", - "0x2004e009", - "0x949e7f5", - "0x4620d001", - "0x3872e7ea", - "0x7440f440", - "0x20524616", - "0x35f885", - "0xf885200f", - "0xf2420031", - "0x62e80005", - "0x11ff004", - "0xf7fe4628", - "0xf414ffe1", - "0xd0127f40", - "0x7f40f5b4", - "0x5f8d301", - "0xf446d504", - "0x4a096180", - "0xe0034b09", - "0x4b0a4a09", - "0x108f046", - "0xe8bd4628", - "0xf7fe41f0", - "0x4640bfe5", - "0xe7bf62ae", - "0x20007", - "0xc54", - "0x3b893fff", - "0xa2888000", - "0x6b893fff", - "0x32888000", - "0x4605b570", - "0x7cac7c40", - "0x289d460e", - "0x482dd001", - "0xf1a4bd70", - "0x28010013", - "0x380cd918", - "0xd8032803", - "0xf4443c11", - "0xe0117480", - "0xd0072c2f", - "0x44f1a4", - "0xd8062802", - "0xf4443c31", - "0xe0077440", - "0x7487f44f", - "0xf1a4e004", - "0x2802007c", - "0x3c6cd820", - "0x11ff004", - "0xd8022910", - "0xf885200f", - "0xf5b40032", - "0xd3037f45", - "0x8368203c", - "0x832820bc", - "0xf7fe4628", - "0xf414ff85", - "0xd0cd7040", - "0x7040f44f", - "0xd3014284", - "0xd50d05f1", - "0x4188f44f", - "0xd9044284", - "0xe0034a0f", - "0x1e40480d", - "0x4a0ebd70", - "0x431a4b0e", - "0xe0036a2b", - "0x4b0e4a0d", - "0x41a0f44f", - "0xd9014284", - "0xe0002006", - "0xea422004", - "0xf6435240", - "0x430270ff", - "0xe8bd4628", - "0xf7fe4070", - "0xbf75", - "0x20008", - "0xbb100000", - "0x3b080000", - "0x13fff", - "0xeb133fff", - "0x32888000", - "0x41f0e92d", - "0x7c867c45", - "0x460f4604", - "0xd0082d20", - "0xbef005", - "0xd0042830", - "0xd0022d38", - "0xe8bd4824", - "0xf1a681f0", - "0x28090010", - "0x4821d302", - "0xe7f61e40", - "0xd8032e11", - "0xf884200f", - "0xe00c0032", - "0xd10a2d20", - "0xd1082e17", - "0xf8042010", - "0x20d80f30", - "0x20007120", - "0xf1a470a0", - "0x1e710430", - "0xf7fe4620", - "0x2e16ff1f", - "0x2d30d006", - "0x2d70d002", - "0xe005d002", - "0xd3032e16", - "0x8360203c", - "0x832020bc", - "0xbff005", - "0xd0012830", - "0xe7cc2000", - "0x6a238b60", - "0xc0f040", - "0x5f88320", - "0xf44fd503", - "0x4a074188", - "0x4a07e004", - "0x102f244", - "0x13c0f443", - "0xe8bd4620", - "0xf7fe41f0", - "0xbf11", - "0x20008", - "0xbb913fff", - "0xebdb3fff", - "0x41f0e92d", - "0x7c857c44", - "0x460f4606", - "0xd00a2c20", - "0xd0082c21", - "0xd0062c30", - "0xd0042c40", - "0xd0022c41", - "0xe8bd4820", - "0xf1a581f0", - "0x28050013", - "0x481dd302", - "0xe7f61e40", - "0xd0012c30", - "0xd1052c41", - "0x833020bc", - "0xd1012c41", - "0x8370203c", - "0x46301e69", - "0xfec8f7fe", - "0xd5010660", - "0xd50a05f8", - "0x4188f44f", - "0xd5010660", - "0xe0004a11", - "0x48124a11", - "0x43026a33", - "0x2d16e007", - "0xf44fd009", - "0x4a0f5080", - "0xf4404b0f", - "0xf0144180", - "0xd0020f9f", - "0x2004e005", - "0x2d16e7f5", - "0xf441d101", - "0x6605100", - "0xf442d501", - "0x46300280", - "0x41f0e8bd", - "0xbeb8f7fe", - "0x20008", - "0xbb100000", - "0x3b080000", - "0x813fff", - "0xeb933fff", - "0x32888000", - "0x41f0e92d", - "0x6a064604", - "0x7ca57c40", - "0x2840460f", - "0x4822d002", - "0x81f0e8bd", - "0x10f1a5", - "0xd83a2807", - "0xf8842052", - "0x200f0035", - "0x31f884", - "0xd00b2d10", - "0xd3052d14", - "0xf88420d2", - "0x20110037", - "0x33f884", - "0xd2052d16", - "0xe005201c", - "0xf8842000", - "0xe7f90032", - "0x1cf244", - "0x2d168360", - "0xf44fd202", - "0xe00170fe", - "0x50fcf244", - "0x1e698320", - "0xf7fe4620", - "0x5f8fe5b", - "0xf244d503", - "0x4a0a4101", - "0x4a0ae005", - "0x105f244", - "0xd3002d16", - "0x48094e08", - "0x43024633", - "0xe8bd4620", - "0xf7fe41f0", - "0x4801be61", - "0xe7bb1e40", - "0x20008", - "0xbb110000", - "0xeb130000", - "0x32888000", - "0xc03fff", - "0x4ff7e92d", - "0x7c847c45", - "0xf04f4606", - "0xf44f0b00", - "0x2d204a80", - "0x2d24d008", - "0x2d25d006", - "0x2d5ed004", - "0x485ad002", - "0x8ffee8bd", - "0x81ff004", - "0x10f1a8", - "0xd8722809", - "0x101f1a8", - "0xf7fe4630", - "0x4954fe1b", - "0xff004", - "0x2c104479", - "0x83705c08", - "0x80f040", - "0xd1028330", - "0xf8862000", - "0x22010032", - "0x46302105", - "0xfc4cf7fe", - "0x7530b2c0", - "0x740f010", - "0xf040d119", - "0xf0800040", - "0x21010204", - "0xf7fe4630", - "0xea5ffd2d", - "0xd1cf0b00", - "0x21052201", - "0xf7fe4630", - "0xf080fc37", - "0xb2c20004", - "0xf0027532", - "0x21010740", - "0xf7fe4630", - "0x2d20fd1b", - "0x2d25d002", - "0xe00fd004", - "0xd3122c16", - "0xe010b937", - "0x33f1a4", - "0xd9012806", - "0xd30e2c53", - "0xf8862052", - "0x200f0035", - "0x31f886", - "0xd0022d20", - "0xd0042d25", - "0x2c17e01b", - "0xb917d319", - "0x2c34e034", - "0xf1a8d315", - "0x28060014", - "0xe8dfd20f", - "0x703f000", - "0x26211c17", - "0x22104927", - "0xe0034479", - "0x22104925", - "0x31084479", - "0xf7fe4630", - "0xf04ffd5f", - "0xb1cf0a80", - "0xf4109801", - "0xd1197f80", - "0xe033e02b", - "0x2210491d", - "0x39084479", - "0x491be7ee", - "0x44792218", - "0xe7e91e89", - "0x22184918", - "0x310c4479", - "0x4916e7e4", - "0x44792218", - "0xe7df311a", - "0xd11b2d20", - "0xd3192c15", - "0x2d20b137", - "0x2c18d101", - "0x20bbd902", - "0xe0012102", - "0x2101203b", - "0xea400600", - "0x480c42c1", - "0x6180f44a", - "0x6a334302", - "0x4b0ae002", - "0x46514a0a", - "0xf7fe4630", - "0x4683fd95", - "0xe74f4658", - "0x1e404801", - "0xe74c", - "0x20008", - "0x8ec", - "0x7c0", - "0x813fff", - "0x38908000", - "0xebd33fff", - "0x4602b50c", - "0xe9d0a053", - "0xe9cd3000", - "0x5c83000", - "0x2a4bd505", - "0x2001d801", - "0x2002bd0c", - "0x2000bd0c", - "0x5c0b4669", - "0xd2024293", - "0x28051c40", - "0x1c40d3f9", - "0xe92dbd0c", - "0x46044df0", - "0x468b4610", - "0x7ca67c65", - "0xffdef7ff", - "0xf44fb2c7", - "0xf04f4880", - "0x2d200a0c", - "0x2dbad00e", - "0x2dbbd00c", - "0x20dbd00a", - "0x2d802108", - "0x2d40d01a", - "0x2d71d024", - "0x483cd028", - "0x8df0e8bd", - "0xf88420d8", - "0x2e110034", - "0x200fd801", - "0x2d20e006", - "0x2e18d103", - "0x2012d301", - "0x2010e000", - "0x30f884", - "0xf8842000", - "0xe0110032", - "0x430f104", - "0x70217120", - "0x20f04f", - "0xf8847160", - "0xf1a4a001", - "0xe0050430", - "0x34f884", - "0x1030f884", - "0x840f04f", - "0x10f1a6", - "0xd302280a", - "0x1e404825", - "0x1e71e7d0", - "0xf7fe4620", - "0x2e13fcff", - "0xf8a4d202", - "0xe006a01a", - "0xd3042dba", - "0xd3042e17", - "0x8360205c", - "0x2d71e001", - "0x2dbad011", - "0x2dbbd00f", - "0x2000d00d", - "0xf0408b61", - "0x43080080", - "0x2d718320", - "0xd106d322", - "0x3111f44f", - "0x4b154a14", - "0x2020e017", - "0x4814e7f0", - "0xea5f62e0", - "0xd50650cb", - "0xf2444812", - "0xea404130", - "0x4b114207", - "0x4811e005", - "0xf2444b11", - "0xea400130", - "0x2e184207", - "0xf441d301", - "0x46203100", - "0x4df0e8bd", - "0xbcdcf7fe", - "0xf8c42000", - "0xe78b8028", - "0x5f4e3b27", - "0x6c", - "0x20008", - "0x3b893fff", - "0xa2888000", - "0x503070", - "0xbbd83fff", - "0xd2988000", - "0xebd83fff", - "0x12988000", - "0x4604b510", - "0x219f2205", - "0xfae8f7fe", - "0x28030e00", - "0x4930d001", - "0x493062e1", - "0xb1197d09", - "0xd0052901", - "0xbd10482e", - "0xf8842012", - "0xe0030030", - "0xd1012803", - "0x8360203c", - "0x46207ca1", - "0xf7fe1e49", - "0x2000fc8b", - "0xb570bd10", - "0x460d4604", - "0x7ca17c40", - "0xf88422d8", - "0x22102034", - "0x2030f884", - "0xf8842200", - "0x4a1f2032", - "0x28021c52", - "0x2820d003", - "0x1c50d013", - "0xf1a1bd70", - "0x28020012", - "0x4620d803", - "0xfc6cf7fe", - "0xf1a1e013", - "0x28010015", - "0x4813d802", - "0xe7f462e0", - "0xd0042919", - "0x2918e001", - "0x4610d001", - "0x4620bd70", - "0xffb0f7ff", - "0xfff010", - "0x6ae0d1f8", - "0xd0f52800", - "0xf4408b60", - "0x83205036", - "0xd50405e8", - "0x4188f44f", - "0x6a234a08", - "0x4a08e003", - "0xf2444b08", - "0x46200104", - "0x4070e8bd", - "0xbc5af7fe", - "0x306005", - "0x40003000", - "0x20006", - "0xbbd13fff", - "0xebd33fff", - "0x32888000", - "0x4604b570", - "0x7c807c41", - "0x29264a26", - "0x2925d003", - "0x1c50d02d", - "0xf000bd70", - "0x290301df", - "0x2107d829", - "0x210074e1", - "0x507f000", - "0x1032f884", - "0x113f105", - "0xf7fe4620", - "0x2d01fc19", - "0x2d02d004", - "0x2d03d006", - "0xe00fd10b", - "0x22284918", - "0xe0034479", - "0x22284916", - "0x31204479", - "0xf7fe4620", - "0x4b14fbb1", - "0xf2484a14", - "0xe01a0102", - "0x22284910", - "0x31304479", - "0x284be7f2", - "0x4610d001", - "0x2116bd70", - "0xf7fe4620", - "0x203cfbf5", - "0x20bc8360", - "0x20528320", - "0x35f884", - "0x4b09200f", - "0xf8844a09", - "0xf44f0031", - "0x462041c8", - "0x4070e8bd", - "0xbbfcf7fe", - "0x20007", - "0x4e8", - "0x2988000", - "0xb993fff", - "0xa2888000", - "0xbb913fff", - "0x4602b508", - "0x4669a039", - "0x90006800", - "0x5c0b2000", - "0xd2024293", - "0x28031c40", - "0x1c40d3f9", - "0xe92dbd08", - "0x469041f0", - "0x460b7c47", - "0x4a317c86", - "0xf44f4604", - "0xf44f4580", - "0x2f304188", - "0xf017d003", - "0xd0090f8f", - "0xf1a6e029", - "0x28040010", - "0x8b20d20a", - "0x20f040", - "0xe0108320", - "0xd01e2f70", - "0x12f1a6", - "0xd3022808", - "0xe8bd4610", - "0xf24481f0", - "0x8360001c", - "0x10fcf244", - "0x5d88320", - "0x460dd500", - "0x46201e71", - "0xfb96f7fe", - "0xf8842052", - "0x200f0035", - "0x31f884", - "0xd5050568", - "0x6a234a18", - "0x4816e011", - "0xe7e21c40", - "0xd00f2f60", - "0x21022203", - "0x504f244", - "0x4122001", - "0x42c1ea42", - "0x430a4911", - "0xea414911", - "0x2f4043c0", - "0xe00ed009", - "0x504f644", - "0xf7ff4640", - "0xb2c2ff9b", - "0x46012003", - "0x2e14e7eb", - "0x2e16d303", - "0xf045d801", - "0x46290501", - "0xe8bd4620", - "0xf7fe41f0", - "0xbb7b", - "0x50321e", - "0x20007", - "0xbbd13fff", - "0xebc03fff", - "0x32808000", - "0x49514a52", - "0x4a526011", - "0x112f04f", - "0xf1026011", - "0xf04f0204", - "0x60110142", - "0xf04f494e", - "0xfb000280", - "0xf44ff001", - "0xfbb011e1", - "0x484bf1f1", - "0xb2ca60c2", - "0xea4f6002", - "0x60412111", - "0x107f04f", - "0xf04f60c1", - "0x60810147", - "0xb1284770", - "0xd0052801", - "0x494320d3", - "0x47706008", - "0xe7fa20db", - "0xe7f820c3", - "0x20f34940", - "0xf04f6008", - "0x610800d3", - "0x608860c8", - "0xf04f6048", - "0x61480013", - "0xb5f04770", - "0x4c34460f", - "0x3ca02100", - "0x4b3861a1", - "0x6163e005", - "0x2116962", - "0xf3c2d4fc", - "0x3978214d", - "0xd2f62929", - "0xd90128a0", - "0xe00220a0", - "0xd200280a", - "0xf44f200a", - "0xfbb171a0", - "0x4358f3f0", - "0xfbb0210c", - "0x4a2cf0f1", - "0xea421e41", - "0x6c624501", - "0x40164e2a", - "0xd01342ae", - "0xf3c66ee6", - "0x2e0c6604", - "0x4e27d101", - "0x7d666e6", - "0xf042d106", - "0x64620201", - "0x1c522200", - "0xd9fc2aff", - "0x6c216465", - "0xd0fc07c9", - "0x140eb00", - "0x7296f44f", - "0xf81ebb2", - "0x2103d201", - "0x2296e006", - "0xf81ebb2", - "0x2102d201", - "0x2101e000", - "0x1f12008a", - "0x6210f042", - "0x9a64a2", - "0xf0421f12", - "0x65a26210", - "0x66e24a08", - "0x67224a12", - "0x40eb00", - "0xfbb50085", - "0x4620f4f1", - "0xff62f7ff", - "0x603cb107", - "0xf0f3fbb5", - "0xbdf0", - "0xc000800", - "0x400500a0", - "0x40086634", - "0xf4240", - "0x40082000", - "0x40086198", - "0x4008618c", - "0x6800078", - "0x6000080", - "0xfff33c3", - "0x1000800", - "0x10000800", - "0xf2402a03", - "0xf0108030", - "0xf0000c03", - "0xf8118015", - "0xf1bc3b01", - "0x44620f02", - "0xf811bf98", - "0xf800cb01", - "0xbf383b01", - "0x3b01f811", - "0x204f1a2", - "0xf800bf98", - "0xbf38cb01", - "0x3b01f800", - "0x303f011", - "0x8025f000", - "0xf0c03a08", - "0xf8518008", - "0x3a083b04", - "0xcb04f851", - "0x1008e8a0", - "0x1d12e7f5", - "0xf851bf5c", - "0xf8403b04", - "0xf3af3b04", - "0x7d28000", - "0xf811bf24", - "0xf8113b01", - "0xbf48cb01", - "0x2b01f811", - "0xf800bf24", - "0xf8003b01", - "0xbf48cb01", - "0x2b01f800", - "0xb5104770", - "0xf0c03a20", - "0xe8b1800b", - "0x3a205018", - "0x5018e8a0", - "0x5018e8b1", - "0x5018e8a0", - "0xaff5f4bf", - "0x7c02ea5f", - "0xe8b1bf24", - "0xe8a05018", - "0xbf445018", - "0xc018c918", - "0x4010e8bd", - "0x7c82ea5f", - "0xf851bf24", - "0xf8403b04", - "0xbf083b04", - "0x7d24770", - "0xf831bf28", - "0xbf483b02", - "0x2b01f811", - "0xf820bf28", - "0xbf483b02", - "0x2b01f800", - "0xf04f4770", - "0xb5000200", - "0x46944613", - "0x39204696", - "0xe8a0bf22", - "0xe8a0500c", - "0xf1b1500c", - "0xf4bf0120", - "0x709aff7", - "0xe8a0bf28", - "0xbf48500c", - "0xf85dc00c", - "0x89eb04", - "0xf840bf28", - "0xbf082b04", - "0xbf484770", - "0x2b02f820", - "0x4f80f011", - "0xf800bf18", - "0x47702b01", - "0x0", - "0x71000", - "0x70000", - "0x10f00", - "0x78000", - "0x20d00", - "0x7c000", - "0x10e00", - "0x0", - "0xf1000", - "0xf0000", - "0x10e00", - "0xf4000", - "0x20d00", - "0xf8000", - "0x10f00", - "0x0", - "0x100c00", - "0x10000", - "0xf1000", - "0x0", - "0x100c00", - "0x10000", - "0x1f1000", - "0x0", - "0x100c00", - "0x10000", - "0x3f1000", - "0x0", - "0x100c00", - "0x10000", - "0x7e1000", - "0x7f000", - "0x100c00", - "0x0", - "0x100c00", - "0x10000", - "0xfe1000", - "0xff000", - "0x100c00", - "0x0", - "0x100c00", - "0x10000", - "0x1fe1000", - "0x1ff000", - "0x100c00", - "0x3c7c0c0c", - "0x3c3c3c3c", - "0x3c3c", - "0x1fe000", - "0x4f301", - "0x6000", - "0x4f301", - "0x1f0000", - "0x1f100", - "0x8000", - "0x1f100", - "0x1e0000", - "0x1ef000", - "0x3fe000", - "0x4f301", - "0x6000", - "0x4f301", - "0x3f0000", - "0x1f100", - "0x8000", - "0x1f100", - "0x3e0000", - "0x3ef000", - "0x7fe000", - "0x4f301", - "0x6000", - "0x4f301", - "0x7f0000", - "0x1f100", - "0x8000", - "0x1f100", - "0x7e0000", - "0x7ef000", - "0x0", - "0x0", - "0x6802005", - "0xbef6f7fd", - "0x0" - ], - "load_address": "0x10000000", - "min_program_length": "0x200", - "page_buffers": [ - "0x10004000", - "0x10004800" - ], - "pc_eraseAll": "0x1000007f", - "pc_erase_sector": "0x1000009f", - "pc_init": "0x10002234", - "pc_program_page": "0x100000cd", - "static_base": "0x10002240" - }, - "memory_map": [ - { - "blocksize": "0x0", - "end": "0x1001ffff", - "length": "0x20000", - "name": "ram", - "start": "0x10000000", - "type": "ram" - }, - { - "blocksize": "0x0", - "end": "0x10091fff", - "length": "0x12000", - "name": "ram", - "start": "0x10080000", - "type": "ram" - }, - { - "blocksize": "0x400", - "end": "0x17ffffff", - "length": "0x4000000", - "name": "flash", - "start": "0x14000000", - "type": "flash" - }, - { - "blocksize": "0x0", - "end": "0x20007fff", - "length": "0x8000", - "name": "ram", - "start": "0x20000000", - "type": "ram" - }, - { - "blocksize": "0x0", - "end": "0x2000ffff", - "length": "0x8000", - "name": "ram", - "start": "0x20008000", - "type": "ram" - } - ], - "target_name": "lpc4330" - }, - "1605": { - "flash_algo": { - "analyzer_address": "0x10005000", - "analyzer_supported": false, - "begin_data": "0x10004000", - "begin_stack": "0x10008000", - "instructions": [ - "0xe00abe00", - "0x62d780d", - "0x24084068", - "0xd3000040", - "0x1e644058", - "0x1c49d1fa", - "0x2a001e52", - "0x4770d1f2", - "0x4770ba40", - "0x4770bac0", - "0xb5104935", - "0x22004449", - "0x604a600a", - "0x608a4a33", - "0x32fff04f", - "0x220860ca", - "0x4931610a", - "0x60084449", - "0x48304931", - "0x49316708", - "0x600820f3", - "0x610820d3", - "0x608860c8", - "0x20136048", - "0x48276148", - "0x4448230c", - "0x210322c0", - "0xf0003880", - "0x2800fb23", - "0x2001d000", - "0x2000bd10", - "0x48204770", - "0x44482100", - "0xf1a06001", - "0x68890180", - "0x491d6041", - "0x21046081", - "0x46016101", - "0xf0013880", - "0x491ab890", - "0x4449b510", - "0x1a416809", - "0x44484815", - "0xf44f6001", - "0x60415180", - "0x60814913", - "0x61012120", - "0x38804601", - "0xf87df001", - "0xd0002800", - "0xbd102001", - "0x4a0e4613", - "0x444ab510", - "0x1a826812", - "0x44484809", - "0x2100e9c0", - "0x60814908", - "0x60c12100", - "0x61012108", - "0x46194602", - "0xf0003880", - "0x2800ff3e", - "0x2001d000", - "0xbd10", - "0x88", - "0x10080000", - "0x4", - "0x1000800", - "0x40050000", - "0x4008618c", - "0x604849f9", - "0xc800480", - "0x2801d006", - "0x2802d008", - "0x2803d008", - "0x6948d008", - "0x79269ca", - "0x4770d4fc", - "0xe7f97d08", - "0xe7f78a88", - "0x7d0a8a88", - "0x4002ea40", - "0xb510e7f2", - "0x1400f44f", - "0x5141eb04", - "0x6000ea41", - "0x4002ea40", - "0xbd104318", - "0x3406a80", - "0xf44fd502", - "0x477010c0", - "0x47702000", - "0x4604b510", - "0x46084613", - "0x46112200", - "0xffe5f7ff", - "0x46204601", - "0xffecf7ff", - "0x4010e8bd", - "0xe7c34308", - "0xb5004bdb", - "0xf7ff609a", - "0x4308ffe3", - "0xeb04f85d", - "0xb530e7ba", - "0x46054cd6", - "0x46114608", - "0x230060a3", - "0xf7ff461a", - "0x4601ffca", - "0xf7ff4628", - "0x4301ffd1", - "0x69e06061", - "0xd4fc0780", - "0x2200bd30", - "0xe7cf2106", - "0x460db5f0", - "0x461f4616", - "0xf7ff4604", - "0x463bfff6", - "0x46294632", - "0xe8bd4620", - "0xe7da40f0", - "0x460db5f0", - "0x461c4616", - "0xf7ff4607", - "0x49c1ffe8", - "0x4638608e", - "0xffaef7ff", - "0xf4404328", - "0x60484000", - "0xc8004a8", - "0x2801d007", - "0xb2a2d00b", - "0xd00a2802", - "0xd0042803", - "0x69c8614c", - "0xd4fc0780", - "0x828abdf0", - "0x750c0c24", - "0x828ae7f7", - "0x49b2e7f5", - "0xf01369cb", - "0xd0190f06", - "0x61ca2210", - "0xf01269ca", - "0xd1fb0f16", - "0xd511075a", - "0xf40269c2", - "0xf5b20260", - "0xd30b0f40", - "0x730a22ff", - "0xf36f69c0", - "0xf100000f", - "0x60480001", - "0x69c87d08", - "0xd4fc0780", - "0xe92d4770", - "0x460541f0", - "0x46882400", - "0x21017cea", - "0xf102fa01", - "0x46204f9d", - "0x69f9b2ce", - "0xd4fc0789", - "0x6c20f644", - "0x45641c64", - "0x2201d207", - "0x46282105", - "0xff64f7ff", - "0x4230b2c0", - "0x4230d0f4", - "0x75284e94", - "0xea5fd00a", - "0xd00c0008", - "0xd00c2801", - "0xd0062802", - "0xf03f1b8", - "0xe008d10b", - "0xe8bd4630", - "0x4c8d81f0", - "0x4c8de005", - "0x4c8de003", - "0xf04fe001", - "0x462834ff", - "0xff3cf7ff", - "0x4308498a", - "0x43087ce9", - "0x69f86078", - "0xd5020780", - "0xd1fa1e64", - "0xb1ece01e", - "0x75287d38", - "0xf00f1b8", - "0x6ae8d01e", - "0xb2c1b1e0", - "0xd0172905", - "0x46282201", - "0xff2af7ff", - "0x7568b2c0", - "0xea106ae9", - "0xd00f2f11", - "0x4107f3c1", - "0x2200b119", - "0xf7ff4628", - "0x4873ff1d", - "0xe7c81c80", - "0xf7ff4628", - "0xe7c3ff7a", - "0xe7eb7d28", - "0xe7c02000", - "0x4615b530", - "0x460b4604", - "0x46112200", - "0xf7ff2001", - "0x4601fef6", - "0x2200462b", - "0xf7ff4620", - "0x6aa0ff41", - "0xd5010480", - "0xbd302000", - "0xe8bd4620", - "0x21004030", - "0xb5f0e77b", - "0x69c44605", - "0x26a66a80", - "0xd50b0581", - "0x120f404", - "0xf00f5b1", - "0xf444d106", - "0x61ec1400", - "0xf4416a29", - "0x62291100", - "0xd5180681", - "0xd5010540", - "0xe0002702", - "0x1d3f2701", - "0x21852201", - "0xf7ff4628", - "0xf000fed9", - "0x69e80307", - "0x110f1c7", - "0x20e0f400", - "0x430340c8", - "0x21812201", - "0xf7ff4628", - "0x6aa8fefb", - "0xd00707c0", - "0x22032300", - "0x462821a3", - "0xfedbf7ff", - "0xd1fd1e76", - "0x5142f3c4", - "0x29064842", - "0x21a5d304", - "0xf4247301", - "0xe0010440", - "0x730121ff", - "0xbdf06184", - "0x4604b510", - "0x6006a80", - "0x2201d511", - "0x4620212b", - "0xfea8f7ff", - "0x6aa17560", - "0xf4210600", - "0xd5023170", - "0x3080f44f", - "0xf44fe001", - "0x43014080", - "0xbd1062a1", - "0x2300b530", - "0x84836381", - "0x84c32307", - "0x8c83e010", - "0x442388cc", - "0x790b8483", - "0x88cd8cc4", - "0xd00107db", - "0xe0002302", - "0xfb052301", - "0x31084303", - "0x3a0884c3", - "0xd2ec2a08", - "0x1ccf3c3", - "0xbd3084c1", - "0xb1226b82", - "0x8c82b109", - "0x8cc0800a", - "0xb1114770", - "0xc126882", - "0x6880800a", - "0x47700cc0", - "0x4604b510", - "0x33cf100", - "0xf7ff2100", - "0x1ffeb", - "0x6aa0d01f", - "0x7080f440", - "0x462062a0", - "0xfe56f7ff", - "0x201ea40", - "0x43024817", - "0x60424810", - "0x7d02e002", - "0x2b01f803", - "0xf1a1000a", - "0xb2890101", - "0x2100d1f7", - "0x42a33480", - "0xf803d202", - "0xe7fa1b01", - "0x78969c1", - "0xbd10d4fc", - "0x22011c49", - "0xf04f408a", - "0x60826100", - "0xd900428a", - "0x60c2460a", - "0x4770", - "0x40003000", - "0x20003", - "0x38270", - "0x419ce0", - "0xa408300", - "0x5204000", - "0x72200000", - "0x41f0e92d", - "0x460d4604", - "0x49fe69c0", - "0x46984616", - "0xd06e4288", - "0x62a54620", - "0xff6af7ff", - "0xf1b068a0", - "0xd9197f80", - "0xf4406aa0", - "0x62a07000", - "0x28017c20", - "0x2820d006", - "0x28c2d00b", - "0xf04fd009", - "0xe6b81002", - "0x22012380", - "0x46202117", - "0xfe1df7ff", - "0x2200e004", - "0x462021b7", - "0xfdfef7ff", - "0xd5040568", - "0x680148ea", - "0x5180f041", - "0x4fe96001", - "0xd5240768", - "0x21352201", - "0xf7ff4620", - "0xb2c0fdef", - "0x7817560", - "0x7c0d455", - "0x2201d135", - "0x46202105", - "0xfde4f7ff", - "0xf0417d61", - "0xea400102", - "0xb2822001", - "0x46202102", - "0xfec8f7ff", - "0xd1cc2800", - "0x21352201", - "0xf7ff4620", - "0x7560fdd3", - "0x7080ea4f", - "0x4e8e019", - "0x2201d51c", - "0x46202105", - "0xfdc8f7ff", - "0x7520b2c0", - "0xd42e0641", - "0x240f040", - "0x46202101", - "0xfeacf7ff", - "0xd1b02800", - "0x21052201", - "0xf7ff4620", - "0x7520fdb7", - "0x28000640", - "0x4638db1d", - "0xe04ee65f", - "0xd5180728", - "0x213f2201", - "0xf7ff4620", - "0xb2c0fda9", - "0x6017560", - "0xf040d40f", - "0x22010380", - "0x4620213e", - "0xfdcef7ff", - "0x213f2201", - "0xf7ff4620", - "0x7560fd99", - "0x6000ea4f", - "0x7a8e7df", - "0x2200d505", - "0x46202138", - "0xfd8ef7ff", - "0x6e8e017", - "0x568d515", - "0x2740d501", - "0x2780e000", - "0x21652201", - "0xf7ff4620", - "0xb2c0fd81", - "0x42387560", - "0xf040d007", - "0x43bb03c8", - "0x21612201", - "0xf7ff4620", - "0xf3c6fda5", - "0x280340c1", - "0xd0106aa0", - "0x2080f420", - "0x52862a0", - "0xf3c6d507", - "0x1e5b4302", - "0x21c02201", - "0xf7ff4620", - "0xe9c4fd7c", - "0x20006807", - "0xf440e60d", - "0xe7ed2080", - "0x41f0e92d", - "0x46044e99", - "0x69b0460f", - "0x46984615", - "0xf40f410", - "0x4601d04d", - "0x40c1f3c0", - "0x280361e1", - "0x2000d04a", - "0x462062a0", - "0xfda9f7ff", - "0x21ff2200", - "0xf7ff4620", - "0x2200fd41", - "0x46112301", - "0xf7ff2065", - "0xf440fd28", - "0xf7ff10c0", - "0xf1a0fd0b", - "0x29800140", - "0x681d208", - "0xf040d406", - "0x220103c0", - "0x46202161", - "0xfd5af7ff", - "0x46202180", - "0xfcbff001", - "0xc1f005", - "0xd02428c1", - "0x2170f44f", - "0x4107ea01", - "0x50c0ea41", - "0x71fff64f", - "0x60304408", - "0x219f2203", - "0xf7ff4620", - "0xf04ffd13", - "0x61204100", - "0x1600e9c4", - "0xf06fb130", - "0x4288417f", - "0x4973d002", - "0xd10b4288", - "0x1d404870", - "0xf440e5b1", - "0xe7af0140", - "0x2080f44f", - "0x486ce7b2", - "0xe5a81e40", - "0x4080f44f", - "0x201c62a0", - "0x209c8360", - "0x4f658320", - "0xd50107a8", - "0xe0004638", - "0xf8444866", - "0x48660f1c", - "0x20206060", - "0x200c7620", - "0x20d87520", - "0x201076a0", - "0xf81475a0", - "0xf1a40c0c", - "0x287f041c", - "0xdc0cd029", - "0xd01d281f", - "0x2801dc04", - "0x281cd014", - "0xe014d139", - "0xd0182820", - "0xd1342837", - "0x28c2e018", - "0xdc04d022", - "0xd019288c", - "0xd12c28bf", - "0x28c8e019", - "0x28efd01d", - "0xe01dd127", - "0x447b4b51", - "0x4b51e01c", - "0xe019447b", - "0x447b4b50", - "0x4b50e016", - "0xe013447b", - "0x447b4b4f", - "0x4b4fe010", - "0xe00d447b", - "0x447b4b4e", - "0x4b4ee00a", - "0xe007447b", - "0x447b4b4d", - "0x4b4de004", - "0xe001447b", - "0x447b4b4c", - "0x4642b12b", - "0x46204629", - "0x46064798", - "0x4e3ae001", - "0xb3061d36", - "0x61e72500", - "0xf0014628", - "0x2103fb1a", - "0x22002301", - "0xf7ff4608", - "0x4601fc78", - "0x46202200", - "0xfc96f7ff", - "0xb10d4601", - "0xe00020ff", - "0x42812000", - "0x1c6dd102", - "0xdbe72d02", - "0xd10a2d02", - "0xf4406aa0", - "0x62a07000", - "0x6aa0e005", - "0xd5020400", - "0xf7ff4620", - "0x4620fe01", - "0xfd73f7ff", - "0xe5184630", - "0x4dffe92d", - "0x4683b08a", - "0x90032000", - "0x68c6980b", - "0xf7ff4658", - "0x4658fcc2", - "0xfdaaf7ff", - "0x8028f8db", - "0x4048ea5f", - "0xf8bbd576", - "0xf0080018", - "0xf4000104", - "0x4308407f", - "0x2001d000", - "0x22014682", - "0x46582105", - "0xfc48f7ff", - "0x14f88b", - "0xaea5f", - "0x2201d004", - "0x46582135", - "0xfc3ef7ff", - "0x15f88b", - "0x4014f8bb", - "0xd0311c70", - "0xf8bbb16e", - "0xea240018", - "0x40300200", - "0xf10a4302", - "0xb2c10001", - "0xf7ff4658", - "0x9003fd19", - "0xe02ce067", - "0x3803fff", - "0x40003000", - "0x20005", - "0xcccccc", - "0xb813fff", - "0x2808000", - "0x13e1", - "0xe51", - "0xc57", - "0x1243", - "0xbab", - "0xd5d", - "0xeef", - "0x1461", - "0x104f", - "0xf99", - "0x1529", - "0x7800980c", - "0x980db310", - "0xf8bb8802", - "0x4002001a", - "0x43224384", - "0xf8bbe7c9", - "0x4220001a", - "0x990cd037", - "0x25002001", - "0x980d7008", - "0xf10a8004", - "0xb2c70001", - "0x1af8bb", - "0xea244639", - "0x46580200", - "0xfcd4f7ff", - "0xb1209003", - "0x2d031c6d", - "0xe189dbf2", - "0x20a6e01f", - "0xd1fd1e40", - "0x21052201", - "0xf7ff4658", - "0xf88bfbd7", - "0xea5f0014", - "0xd004000a", - "0x21352201", - "0xf7ff4658", - "0xf88bfbcd", - "0xf8bb0015", - "0xf8bb0014", - "0x4208101a", - "0x48f9d002", - "0xe16b9003", - "0x28009803", - "0xf418d1dd", - "0xd0da3f60", - "0xf8db2000", - "0x46045038", - "0x20019006", - "0xb10e9008", - "0xe00020ff", - "0x90092000", - "0x90002000", - "0xf44f980b", - "0xe9d03780", - "0x44081000", - "0xf10b9002", - "0x4682003c", - "0xf8db9005", - "0xa907001c", - "0x5040f3c0", - "0x90011cc0", - "0xf7ff4658", - "0x9004fd1d", - "0xf8bdb915", - "0x9006001c", - "0x4008ea5f", - "0xea5fd505", - "0xd40250c8", - "0xf7ff4658", - "0x1c70fd1d", - "0xb1b6d001", - "0x980ce104", - "0xb1587800", - "0x4008ea5f", - "0xe9ddd5f8", - "0x990d2004", - "0xfa9ef001", - "0xf8ad2000", - "0xe0f5001c", - "0xf7ff4658", - "0x2000fc7c", - "0xe8bdb00e", - "0x990c8df0", - "0x70082000", - "0x4008ea5f", - "0xe9ddd5e2", - "0x980d2104", - "0xfa88f001", - "0x9806e0e2", - "0x88e8bb28", - "0x68289006", - "0xf9959000", - "0x28000005", - "0x4240da00", - "0x40872701", - "0x7c07928", - "0x1b0d021", - "0x1006ea40", - "0x86ea40", - "0xb2c04330", - "0x20029009", - "0x2c409008", - "0x2c10d00c", - "0x2c04d00a", - "0x2c01d008", - "0x2c20d006", - "0x2c08d00a", - "0x2c02d008", - "0xe017d006", - "0xf7ff4658", - "0xf04ffc40", - "0xe7c11002", - "0x454ea44", - "0xb10ee00e", - "0xe00020ff", - "0x90092000", - "0x90082001", - "0xd0032c30", - "0xd0012c0c", - "0xd1012c03", - "0x444ea04", - "0xb125b934", - "0x7c07928", - "0x24c0d001", - "0x2480e000", - "0x6801980b", - "0x44389800", - "0xd2784281", - "0x98029900", - "0xd9744288", - "0x3f40f418", - "0x1c70d063", - "0x2e00d00b", - "0xea5fdd1b", - "0xd50b30c8", - "0x2136460b", - "0x9a014658", - "0xfb32f7ff", - "0xf89ae04e", - "0x42200000", - "0xe049d1f1", - "0x22002301", - "0x990120e5", - "0xfae3f7ff", - "0x23014601", - "0x9a004658", - "0xfb2ef7ff", - "0xd13be03c", - "0x30c8ea5f", - "0x203cd501", - "0x20e8e000", - "0x22002301", - "0xf7ff9901", - "0x4601fad0", - "0x9a004658", - "0xfaeef7ff", - "0xea5fb2c0", - "0xd5023188", - "0x78943c1", - "0x7c0d00b", - "0xea5fd025", - "0xd50b30c8", - "0x3200e9dd", - "0x46582139", - "0xfafcf7ff", - "0x4658e010", - "0xfbcff7ff", - "0xe751487a", - "0x22002301", - "0x990120e5", - "0xfaadf7ff", - "0x23004601", - "0x9a004658", - "0xfaf8f7ff", - "0x2001990c", - "0xf89a7008", - "0x43200000", - "0xf88a", - "0xbbe89803", - "0xf89ae011", - "0x43a00000", - "0xf89ae7f6", - "0x99092000", - "0x4ea22", - "0x43084021", - "0xd0044282", - "0xf88a", - "0x2001990c", - "0x98087008", - "0xd10140c4", - "0xa01f10a", - "0xf995b135", - "0x28000005", - "0xf1c7da02", - "0xe0000000", - "0x99004638", - "0x90004408", - "0xf1a09806", - "0x4000001", - "0x90060c00", - "0xb10dd102", - "0x508f105", - "0x1cf8bd", - "0x101f1a0", - "0x101cf8ad", - "0xf47f2800", - "0x980caf14", - "0xb1187800", - "0x4008ea5f", - "0xe000d51c", - "0x4658e01a", - "0xfa9bf7ff", - "0x99054658", - "0xfa62f7ff", - "0x43109a04", - "0x43104a4b", - "0x60504a4b", - "0xf811e002", - "0x75100b01", - "0xf1a09804", - "0xb29b0301", - "0x28009304", - "0x69d0d1f5", - "0xd4fc0780", - "0xf7ff4658", - "0x9803fb5a", - "0xb570e6dc", - "0x6886680a", - "0x6803b1ce", - "0xd8064293", - "0x684d68c4", - "0x4415441c", - "0xd30042ac", - "0x42961ad2", - "0x684bd910", - "0x42b34413", - "0x690cd80c", - "0xf30f014", - "0x68c0d002", - "0xd8054283", - "0x600a2000", - "0x4830bd70", - "0xbd701c80", - "0x1e40482e", - "0xb570bd70", - "0x4615460c", - "0xf7ff4606", - "0x4630fa8a", - "0xfa51f7ff", - "0x608d492a", - "0xf7ff4630", - "0x6a32fa17", - "0x260f402", - "0x6204ea42", - "0x60484310", - "0xd0072cc7", - "0xd0052c60", - "0x46302101", - "0x4070e8bd", - "0xba91f7ff", - "0xe7f82103", - "0x460db570", - "0x46044616", - "0xfa33f7ff", - "0x6085481b", - "0x43316a21", - "0xbd706041", - "0x4df0e92d", - "0x460e4683", - "0x46984617", - "0xf8df681c", - "0x6855a054", - "0x693be067", - "0xb2d0683a", - "0x7480f5c0", - "0x42a5b113", - "0x462cd200", - "0xe0024621", - "0x1e6d1c76", - "0x7b01e64", - "0x7830d009", - "0xd11828ff", - "0x2c00b1f5", - "0xe01bd1f4", - "0x1f2d1d36", - "0x68301f24", - "0xd10e1c40", - "0xd30c2d04", - "0xd2f52c04", - "0xe00a", - "0x20005", - "0x42208000", - "0x40003000", - "0x1e6d1c76", - "0xb12d1e64", - "0x2c04b124", - "0x7830d202", - "0xd0f528ff", - "0x44101b08", - "0xb3956038", - "0xd0c72c00", - "0x46224601", - "0xf7ff4658", - "0x6838ffab", - "0x60384420", - "0x2c00e001", - "0x4650d0bb", - "0xd00b07b1", - "0xb14cb1c5", - "0x1b01f816", - "0x1e6d7501", - "0xe7f51e64", - "0x6141ce02", - "0x1f241f2d", - "0xd3072d04", - "0xd2f72c04", - "0xf816e005", - "0x75011b01", - "0x1e641e6d", - "0x2c00b115", - "0xe000d1f7", - "0x2102b92c", - "0xf7ff4658", - "0x2800fa12", - "0x2d00d104", - "0x2000d1d7", - "0x4000f8c8", - "0x6800e613", - "0xe0044408", - "0x1c496801", - "0x1d00d104", - "0x2a001f12", - "0x2000d1f8", - "0x68134770", - "0x44186800", - "0x40486010", - "0xd0010780", - "0x47702000", - "0x47702001", - "0x460cb53f", - "0xaa02461d", - "0xffeff7ff", - "0xb948b335", - "0x9802e022", - "0x1b01f814", - "0x42917802", - "0x1c40d11f", - "0x90021e6d", - "0xd00b07a0", - "0xd1f22d00", - "0x9802e016", - "0x68026821", - "0xd1124291", - "0x1d241d00", - "0x90021f2d", - "0xd2f42d04", - "0x9802e008", - "0x1b01f814", - "0x42917802", - "0x1c40d105", - "0x90021e6d", - "0xd1f42d00", - "0xb0042000", - "0xb5f8bd30", - "0x6811460c", - "0x68559100", - "0x43de469c", - "0x4621466a", - "0xffb9f7ff", - "0xf00cb385", - "0xb1e803ff", - "0x7a0b2f1", - "0xb34dd018", - "0xf8149f00", - "0xf8170b01", - "0x40582b01", - "0x4210404a", - "0xd11b9700", - "0xe7f01e6d", - "0x68209a00", - "0xea806811", - "0x4071000c", - "0xd1114208", - "0x1d241d12", - "0x92001f2d", - "0xd2f12d04", - "0xb16db2f1", - "0xf8149e00", - "0xf8160b01", - "0x40582b01", - "0x4210404a", - "0xd0019600", - "0xbdf82001", - "0xe7f01e6d", - "0x2000e7ff", - "0xe92dbdf8", - "0x46174df7", - "0x468bb09d", - "0x46392214", - "0xf001a802", - "0x2500f85c", - "0x5068f88d", - "0x687ca902", - "0xf7ff981d", - "0x6fe9c", - "0x9802d138", - "0x4420901b", - "0x46289018", - "0x69389005", - "0xd4070580", - "0xaa1aab07", - "0x981da902", - "0xfc72f7ff", - "0xd1270006", - "0x981de0b1", - "0xa01f04f", - "0x1030f890", - "0xf001fa0a", - "0x1e429902", - "0xeb004391", - "0x91010801", - "0xeba89902", - "0x42ac0501", - "0x4625d200", - "0x69389503", - "0xd4060740", - "0xaa022300", - "0x981d4659", - "0xff7df7ff", - "0x2001b100", - "0x91199902", - "0xd07d2800", - "0x7006938", - "0x48ead502", - "0xe53cb020", - "0xb30868b8", - "0x1201e9dd", - "0xa01eba2", - "0x46429918", - "0xd2034541", - "0x9a184611", - "0xe0001a89", - "0x46882100", - "0x10aea5f", - "0x460ad005", - "0xf0009901", - "0x9801ffbb", - "0xf1b89002", - "0xd00a0f00", - "0x464268b9", - "0xaeb01", - "0xf0009918", - "0xe002ffaf", - "0x800f04f", - "0x981d46c2", - "0xf8909a01", - "0xf7ff1034", - "0x6fe56", - "0x981dd003", - "0xf985f7ff", - "0x6938e066", - "0xd5100680", - "0xf7ff981d", - "0x981df97e", - "0x99012201", - "0x30f890", - "0x981d4082", - "0xfee7f7ff", - "0xd1b92800", - "0xf7ff981d", - "0x2000f8cc", - "0x90069000", - "0xa00cf8cd", - "0xaa02466b", - "0x981d68b9", - "0xfe5ef7ff", - "0x95034606", - "0xf00f1b8", - "0x2000d003", - "0xb1169006", - "0x2001e008", - "0x466be7fa", - "0x4659aa02", - "0xf7ff981d", - "0x4606fe4d", - "0xf8cd2001", - "0x9006800c", - "0x68b9b966", - "0x4451466b", - "0x981daa02", - "0xfe40f7ff", - "0xd1030006", - "0xb1089800", - "0x1602f04f", - "0xe000981d", - "0xf7ffe056", - "0xb9eef93c", - "0x6c06938", - "0x462bd507", - "0x9a194659", - "0xf7ff981d", - "0x6febb", - "0x44abd112", - "0x2c001b64", - "0xaf4bf47f", - "0xb15868f8", - "0x981b9005", - "0x68789002", - "0xab079003", - "0xa902aa1a", - "0xf7ff981d", - "0x4606fbad", - "0xe7614630", - "0xfff041", - "0x1c6d1a45", - "0xd20042ac", - "0xf04f4625", - "0xaa0233ff", - "0x95034659", - "0xf7ff981d", - "0xb1f0fec6", - "0xf7ff981d", - "0x2000f864", - "0x466b9000", - "0x4659aa02", - "0xa018f8cd", - "0xf7ff981d", - "0x4606fdf7", - "0xf7ff981d", - "0x2e00f8fa", - "0x6938d1da", - "0xd50b06c0", - "0x4659462b", - "0x981d9a19", - "0xfe78f7ff", - "0xd1cf0006", - "0x9802e002", - "0x90024428", - "0x1b6444ab", - "0xd0b92c00", - "0x45419902", - "0xaf01f4bf", - "0xe92de7c4", - "0xb09e4df3", - "0x2214460c", - "0xf000a802", - "0x2600ff38", - "0x606cf88d", - "0x90016860", - "0xf890981e", - "0x20011030", - "0x901a4088", - "0x9618a902", - "0xf7ff981e", - "0x5fd70", - "0x9605d17e", - "0x5806920", - "0xab07d407", - "0xa902aa1b", - "0xf7ff981e", - "0x5fb4b", - "0xe9ddd172", - "0x44080101", - "0x9000911c", - "0xd16c2900", - "0x6881981e", - "0x42819801", - "0x981ed867", - "0x6406a80", - "0x981ed463", - "0xf803f7ff", - "0x461a2300", - "0x981e21c7", - "0xffcaf7fe", - "0x981e2103", - "0xf819f7ff", - "0x981e4605", - "0xf899f7ff", - "0x2703e09f", - "0x4438981e", - "0xf890901d", - "0x28000030", - "0x2101d07e", - "0xf800fa01", - "0xf1a89802", - "0xea200101", - "0xeba00b01", - "0xeb0b060b", - "0x90190008", - "0x42819900", - "0x1a40d201", - "0x2000e000", - "0x981a4682", - "0xd2794286", - "0xd2774582", - "0xb16868a0", - "0x4632b11e", - "0xf0004659", - "0xf1bafe8b", - "0xd0050f00", - "0x465268a0", - "0x99004430", - "0xfe82f000", - "0x465a981e", - "0xf8904438", - "0x981e1034", - "0xfd2bf7ff", - "0x981e4605", - "0xf85bf7ff", - "0xd1702d00", - "0x6806920", - "0x981dd50a", - "0x46592201", - "0x30f890", - "0x981e4082", - "0xfdbff7ff", - "0xd1030005", - "0xb3c068a0", - "0xe0012001", - "0xe048e05e", - "0xb1fe9006", - "0xf7fe981e", - "0xe9cdff9c", - "0xab18b602", - "0x68a1aa02", - "0xf7ff981e", - "0x4605fd31", - "0xf7ff981e", - "0xb925f834", - "0xb1109818", - "0x1502f04f", - "0x6920e045", - "0xd50606c0", - "0x465a4633", - "0x981e68a1", - "0xfdaef7ff", - "0xbbd54605", - "0xf00f1ba", - "0x981ed017", - "0xff79f7fe", - "0xe9cd9800", - "0x68a00a02", - "0x1981ab18", - "0x981eaa02", - "0xfd0cf7ff", - "0xe0014605", - "0xe006e010", - "0xf7ff981e", - "0xbb15f80c", - "0x28009818", - "0x9819d1d6", - "0x98019002", - "0xd90b4540", - "0x8eba0", - "0xe0029001", - "0xf57f1e7f", - "0x9801af65", - "0xf47f2800", - "0xb975af60", - "0xb16068e0", - "0x9002981c", - "0x90036860", - "0x900568e0", - "0xaa1bab07", - "0x981ea902", - "0xfa78f7ff", - "0x46284605", - "0xe62c", - "0x2000b", - "0x41f0e92d", - "0x7c847c46", - "0x460f4605", - "0xd0042e30", - "0xd0072e40", - "0xe8bd481c", - "0xf1a481f0", - "0x28070010", - "0xe009d211", - "0x15f1a4", - "0xd20c2802", - "0x401cf244", - "0xf2448368", - "0x832850fc", - "0x46281e61", - "0xf878f7ff", - "0xd1052e40", - "0x4810e002", - "0xe7e41e40", - "0xd50805f8", - "0xf44f480e", - "0x2c164188", - "0x4b0dd301", - "0x6a2be005", - "0x480ce003", - "0xf2444b0c", - "0x2c160104", - "0x2206d301", - "0x2204e000", - "0x5242ea40", - "0x43024808", - "0xe8bd4628", - "0xf7ff41f0", - "0xb86f", - "0x20008", - "0xbb010000", - "0xa2888000", - "0xeb030000", - "0x32888000", - "0x103fff", - "0x41f0e92d", - "0x7c404605", - "0xf44f460f", - "0x7ca94680", - "0x343f1a0", - "0xb24c3a", - "0x800f04f", - "0xd8252b05", - "0xd140094b", - "0x432f1a0", - "0x28444616", - "0x2845d006", - "0x2846d00b", - "0xf444d33d", - "0xe03a7480", - "0x22204931", - "0x46284479", - "0xffcef7fe", - "0x2901e033", - "0x492dd131", - "0x44792220", - "0x4628310e", - "0xffc4f7fe", - "0x219f2204", - "0xf7fe4628", - "0xe00fe59", - "0xe022d1e5", - "0xd0092865", - "0xd0072866", - "0xd0142886", - "0xd0122887", - "0x1c404820", - "0x81f0e8bd", - "0x456f1a0", - "0xd0082865", - "0x8368206c", - "0x80f040", - "0x20008328", - "0x32f885", - "0x2004e009", - "0x949e7f5", - "0x4620d001", - "0x3872e7ea", - "0x7440f440", - "0x20524616", - "0x35f885", - "0xf885200f", - "0xf2420031", - "0x62e80005", - "0x11ff004", - "0xf7fe4628", - "0xf414ffe1", - "0xd0127f40", - "0x7f40f5b4", - "0x5f8d301", - "0xf446d504", - "0x4a096180", - "0xe0034b09", - "0x4b0a4a09", - "0x108f046", - "0xe8bd4628", - "0xf7fe41f0", - "0x4640bfe5", - "0xe7bf62ae", - "0x20007", - "0xc54", - "0x3b893fff", - "0xa2888000", - "0x6b893fff", - "0x32888000", - "0x4605b570", - "0x7cac7c40", - "0x289d460e", - "0x482dd001", - "0xf1a4bd70", - "0x28010013", - "0x380cd918", - "0xd8032803", - "0xf4443c11", - "0xe0117480", - "0xd0072c2f", - "0x44f1a4", - "0xd8062802", - "0xf4443c31", - "0xe0077440", - "0x7487f44f", - "0xf1a4e004", - "0x2802007c", - "0x3c6cd820", - "0x11ff004", - "0xd8022910", - "0xf885200f", - "0xf5b40032", - "0xd3037f45", - "0x8368203c", - "0x832820bc", - "0xf7fe4628", - "0xf414ff85", - "0xd0cd7040", - "0x7040f44f", - "0xd3014284", - "0xd50d05f1", - "0x4188f44f", - "0xd9044284", - "0xe0034a0f", - "0x1e40480d", - "0x4a0ebd70", - "0x431a4b0e", - "0xe0036a2b", - "0x4b0e4a0d", - "0x41a0f44f", - "0xd9014284", - "0xe0002006", - "0xea422004", - "0xf6435240", - "0x430270ff", - "0xe8bd4628", - "0xf7fe4070", - "0xbf75", - "0x20008", - "0xbb100000", - "0x3b080000", - "0x13fff", - "0xeb133fff", - "0x32888000", - "0x41f0e92d", - "0x7c867c45", - "0x460f4604", - "0xd0082d20", - "0xbef005", - "0xd0042830", - "0xd0022d38", - "0xe8bd4824", - "0xf1a681f0", - "0x28090010", - "0x4821d302", - "0xe7f61e40", - "0xd8032e11", - "0xf884200f", - "0xe00c0032", - "0xd10a2d20", - "0xd1082e17", - "0xf8042010", - "0x20d80f30", - "0x20007120", - "0xf1a470a0", - "0x1e710430", - "0xf7fe4620", - "0x2e16ff1f", - "0x2d30d006", - "0x2d70d002", - "0xe005d002", - "0xd3032e16", - "0x8360203c", - "0x832020bc", - "0xbff005", - "0xd0012830", - "0xe7cc2000", - "0x6a238b60", - "0xc0f040", - "0x5f88320", - "0xf44fd503", - "0x4a074188", - "0x4a07e004", - "0x102f244", - "0x13c0f443", - "0xe8bd4620", - "0xf7fe41f0", - "0xbf11", - "0x20008", - "0xbb913fff", - "0xebdb3fff", - "0x41f0e92d", - "0x7c857c44", - "0x460f4606", - "0xd00a2c20", - "0xd0082c21", - "0xd0062c30", - "0xd0042c40", - "0xd0022c41", - "0xe8bd4820", - "0xf1a581f0", - "0x28050013", - "0x481dd302", - "0xe7f61e40", - "0xd0012c30", - "0xd1052c41", - "0x833020bc", - "0xd1012c41", - "0x8370203c", - "0x46301e69", - "0xfec8f7fe", - "0xd5010660", - "0xd50a05f8", - "0x4188f44f", - "0xd5010660", - "0xe0004a11", - "0x48124a11", - "0x43026a33", - "0x2d16e007", - "0xf44fd009", - "0x4a0f5080", - "0xf4404b0f", - "0xf0144180", - "0xd0020f9f", - "0x2004e005", - "0x2d16e7f5", - "0xf441d101", - "0x6605100", - "0xf442d501", - "0x46300280", - "0x41f0e8bd", - "0xbeb8f7fe", - "0x20008", - "0xbb100000", - "0x3b080000", - "0x813fff", - "0xeb933fff", - "0x32888000", - "0x41f0e92d", - "0x6a064604", - "0x7ca57c40", - "0x2840460f", - "0x4822d002", - "0x81f0e8bd", - "0x10f1a5", - "0xd83a2807", - "0xf8842052", - "0x200f0035", - "0x31f884", - "0xd00b2d10", - "0xd3052d14", - "0xf88420d2", - "0x20110037", - "0x33f884", - "0xd2052d16", - "0xe005201c", - "0xf8842000", - "0xe7f90032", - "0x1cf244", - "0x2d168360", - "0xf44fd202", - "0xe00170fe", - "0x50fcf244", - "0x1e698320", - "0xf7fe4620", - "0x5f8fe5b", - "0xf244d503", - "0x4a0a4101", - "0x4a0ae005", - "0x105f244", - "0xd3002d16", - "0x48094e08", - "0x43024633", - "0xe8bd4620", - "0xf7fe41f0", - "0x4801be61", - "0xe7bb1e40", - "0x20008", - "0xbb110000", - "0xeb130000", - "0x32888000", - "0xc03fff", - "0x4ff7e92d", - "0x7c847c45", - "0xf04f4606", - "0xf44f0b00", - "0x2d204a80", - "0x2d24d008", - "0x2d25d006", - "0x2d5ed004", - "0x485ad002", - "0x8ffee8bd", - "0x81ff004", - "0x10f1a8", - "0xd8722809", - "0x101f1a8", - "0xf7fe4630", - "0x4954fe1b", - "0xff004", - "0x2c104479", - "0x83705c08", - "0x80f040", - "0xd1028330", - "0xf8862000", - "0x22010032", - "0x46302105", - "0xfc4cf7fe", - "0x7530b2c0", - "0x740f010", - "0xf040d119", - "0xf0800040", - "0x21010204", - "0xf7fe4630", - "0xea5ffd2d", - "0xd1cf0b00", - "0x21052201", - "0xf7fe4630", - "0xf080fc37", - "0xb2c20004", - "0xf0027532", - "0x21010740", - "0xf7fe4630", - "0x2d20fd1b", - "0x2d25d002", - "0xe00fd004", - "0xd3122c16", - "0xe010b937", - "0x33f1a4", - "0xd9012806", - "0xd30e2c53", - "0xf8862052", - "0x200f0035", - "0x31f886", - "0xd0022d20", - "0xd0042d25", - "0x2c17e01b", - "0xb917d319", - "0x2c34e034", - "0xf1a8d315", - "0x28060014", - "0xe8dfd20f", - "0x703f000", - "0x26211c17", - "0x22104927", - "0xe0034479", - "0x22104925", - "0x31084479", - "0xf7fe4630", - "0xf04ffd5f", - "0xb1cf0a80", - "0xf4109801", - "0xd1197f80", - "0xe033e02b", - "0x2210491d", - "0x39084479", - "0x491be7ee", - "0x44792218", - "0xe7e91e89", - "0x22184918", - "0x310c4479", - "0x4916e7e4", - "0x44792218", - "0xe7df311a", - "0xd11b2d20", - "0xd3192c15", - "0x2d20b137", - "0x2c18d101", - "0x20bbd902", - "0xe0012102", - "0x2101203b", - "0xea400600", - "0x480c42c1", - "0x6180f44a", - "0x6a334302", - "0x4b0ae002", - "0x46514a0a", - "0xf7fe4630", - "0x4683fd95", - "0xe74f4658", - "0x1e404801", - "0xe74c", - "0x20008", - "0x8ec", - "0x7c0", - "0x813fff", - "0x38908000", - "0xebd33fff", - "0x4602b50c", - "0xe9d0a053", - "0xe9cd3000", - "0x5c83000", - "0x2a4bd505", - "0x2001d801", - "0x2002bd0c", - "0x2000bd0c", - "0x5c0b4669", - "0xd2024293", - "0x28051c40", - "0x1c40d3f9", - "0xe92dbd0c", - "0x46044df0", - "0x468b4610", - "0x7ca67c65", - "0xffdef7ff", - "0xf44fb2c7", - "0xf04f4880", - "0x2d200a0c", - "0x2dbad00e", - "0x2dbbd00c", - "0x20dbd00a", - "0x2d802108", - "0x2d40d01a", - "0x2d71d024", - "0x483cd028", - "0x8df0e8bd", - "0xf88420d8", - "0x2e110034", - "0x200fd801", - "0x2d20e006", - "0x2e18d103", - "0x2012d301", - "0x2010e000", - "0x30f884", - "0xf8842000", - "0xe0110032", - "0x430f104", - "0x70217120", - "0x20f04f", - "0xf8847160", - "0xf1a4a001", - "0xe0050430", - "0x34f884", - "0x1030f884", - "0x840f04f", - "0x10f1a6", - "0xd302280a", - "0x1e404825", - "0x1e71e7d0", - "0xf7fe4620", - "0x2e13fcff", - "0xf8a4d202", - "0xe006a01a", - "0xd3042dba", - "0xd3042e17", - "0x8360205c", - "0x2d71e001", - "0x2dbad011", - "0x2dbbd00f", - "0x2000d00d", - "0xf0408b61", - "0x43080080", - "0x2d718320", - "0xd106d322", - "0x3111f44f", - "0x4b154a14", - "0x2020e017", - "0x4814e7f0", - "0xea5f62e0", - "0xd50650cb", - "0xf2444812", - "0xea404130", - "0x4b114207", - "0x4811e005", - "0xf2444b11", - "0xea400130", - "0x2e184207", - "0xf441d301", - "0x46203100", - "0x4df0e8bd", - "0xbcdcf7fe", - "0xf8c42000", - "0xe78b8028", - "0x5f4e3b27", - "0x6c", - "0x20008", - "0x3b893fff", - "0xa2888000", - "0x503070", - "0xbbd83fff", - "0xd2988000", - "0xebd83fff", - "0x12988000", - "0x4604b510", - "0x219f2205", - "0xfae8f7fe", - "0x28030e00", - "0x4930d001", - "0x493062e1", - "0xb1197d09", - "0xd0052901", - "0xbd10482e", - "0xf8842012", - "0xe0030030", - "0xd1012803", - "0x8360203c", - "0x46207ca1", - "0xf7fe1e49", - "0x2000fc8b", - "0xb570bd10", - "0x460d4604", - "0x7ca17c40", - "0xf88422d8", - "0x22102034", - "0x2030f884", - "0xf8842200", - "0x4a1f2032", - "0x28021c52", - "0x2820d003", - "0x1c50d013", - "0xf1a1bd70", - "0x28020012", - "0x4620d803", - "0xfc6cf7fe", - "0xf1a1e013", - "0x28010015", - "0x4813d802", - "0xe7f462e0", - "0xd0042919", - "0x2918e001", - "0x4610d001", - "0x4620bd70", - "0xffb0f7ff", - "0xfff010", - "0x6ae0d1f8", - "0xd0f52800", - "0xf4408b60", - "0x83205036", - "0xd50405e8", - "0x4188f44f", - "0x6a234a08", - "0x4a08e003", - "0xf2444b08", - "0x46200104", - "0x4070e8bd", - "0xbc5af7fe", - "0x306005", - "0x40003000", - "0x20006", - "0xbbd13fff", - "0xebd33fff", - "0x32888000", - "0x4604b570", - "0x7c807c41", - "0x29264a26", - "0x2925d003", - "0x1c50d02d", - "0xf000bd70", - "0x290301df", - "0x2107d829", - "0x210074e1", - "0x507f000", - "0x1032f884", - "0x113f105", - "0xf7fe4620", - "0x2d01fc19", - "0x2d02d004", - "0x2d03d006", - "0xe00fd10b", - "0x22284918", - "0xe0034479", - "0x22284916", - "0x31204479", - "0xf7fe4620", - "0x4b14fbb1", - "0xf2484a14", - "0xe01a0102", - "0x22284910", - "0x31304479", - "0x284be7f2", - "0x4610d001", - "0x2116bd70", - "0xf7fe4620", - "0x203cfbf5", - "0x20bc8360", - "0x20528320", - "0x35f884", - "0x4b09200f", - "0xf8844a09", - "0xf44f0031", - "0x462041c8", - "0x4070e8bd", - "0xbbfcf7fe", - "0x20007", - "0x4e8", - "0x2988000", - "0xb993fff", - "0xa2888000", - "0xbb913fff", - "0x4602b508", - "0x4669a039", - "0x90006800", - "0x5c0b2000", - "0xd2024293", - "0x28031c40", - "0x1c40d3f9", - "0xe92dbd08", - "0x469041f0", - "0x460b7c47", - "0x4a317c86", - "0xf44f4604", - "0xf44f4580", - "0x2f304188", - "0xf017d003", - "0xd0090f8f", - "0xf1a6e029", - "0x28040010", - "0x8b20d20a", - "0x20f040", - "0xe0108320", - "0xd01e2f70", - "0x12f1a6", - "0xd3022808", - "0xe8bd4610", - "0xf24481f0", - "0x8360001c", - "0x10fcf244", - "0x5d88320", - "0x460dd500", - "0x46201e71", - "0xfb96f7fe", - "0xf8842052", - "0x200f0035", - "0x31f884", - "0xd5050568", - "0x6a234a18", - "0x4816e011", - "0xe7e21c40", - "0xd00f2f60", - "0x21022203", - "0x504f244", - "0x4122001", - "0x42c1ea42", - "0x430a4911", - "0xea414911", - "0x2f4043c0", - "0xe00ed009", - "0x504f644", - "0xf7ff4640", - "0xb2c2ff9b", - "0x46012003", - "0x2e14e7eb", - "0x2e16d303", - "0xf045d801", - "0x46290501", - "0xe8bd4620", - "0xf7fe41f0", - "0xbb7b", - "0x50321e", - "0x20007", - "0xbbd13fff", - "0xebc03fff", - "0x32808000", - "0x49514a52", - "0x4a526011", - "0x112f04f", - "0xf1026011", - "0xf04f0204", - "0x60110142", - "0xf04f494e", - "0xfb000280", - "0xf44ff001", - "0xfbb011e1", - "0x484bf1f1", - "0xb2ca60c2", - "0xea4f6002", - "0x60412111", - "0x107f04f", - "0xf04f60c1", - "0x60810147", - "0xb1284770", - "0xd0052801", - "0x494320d3", - "0x47706008", - "0xe7fa20db", - "0xe7f820c3", - "0x20f34940", - "0xf04f6008", - "0x610800d3", - "0x608860c8", - "0xf04f6048", - "0x61480013", - "0xb5f04770", - "0x4c34460f", - "0x3ca02100", - "0x4b3861a1", - "0x6163e005", - "0x2116962", - "0xf3c2d4fc", - "0x3978214d", - "0xd2f62929", - "0xd90128a0", - "0xe00220a0", - "0xd200280a", - "0xf44f200a", - "0xfbb171a0", - "0x4358f3f0", - "0xfbb0210c", - "0x4a2cf0f1", - "0xea421e41", - "0x6c624501", - "0x40164e2a", - "0xd01342ae", - "0xf3c66ee6", - "0x2e0c6604", - "0x4e27d101", - "0x7d666e6", - "0xf042d106", - "0x64620201", - "0x1c522200", - "0xd9fc2aff", - "0x6c216465", - "0xd0fc07c9", - "0x140eb00", - "0x7296f44f", - "0xf81ebb2", - "0x2103d201", - "0x2296e006", - "0xf81ebb2", - "0x2102d201", - "0x2101e000", - "0x1f12008a", - "0x6210f042", - "0x9a64a2", - "0xf0421f12", - "0x65a26210", - "0x66e24a08", - "0x67224a12", - "0x40eb00", - "0xfbb50085", - "0x4620f4f1", - "0xff62f7ff", - "0x603cb107", - "0xf0f3fbb5", - "0xbdf0", - "0xc000800", - "0x400500a0", - "0x40086634", - "0xf4240", - "0x40082000", - "0x40086198", - "0x4008618c", - "0x6800078", - "0x6000080", - "0xfff33c3", - "0x1000800", - "0x10000800", - "0xf2402a03", - "0xf0108030", - "0xf0000c03", - "0xf8118015", - "0xf1bc3b01", - "0x44620f02", - "0xf811bf98", - "0xf800cb01", - "0xbf383b01", - "0x3b01f811", - "0x204f1a2", - "0xf800bf98", - "0xbf38cb01", - "0x3b01f800", - "0x303f011", - "0x8025f000", - "0xf0c03a08", - "0xf8518008", - "0x3a083b04", - "0xcb04f851", - "0x1008e8a0", - "0x1d12e7f5", - "0xf851bf5c", - "0xf8403b04", - "0xf3af3b04", - "0x7d28000", - "0xf811bf24", - "0xf8113b01", - "0xbf48cb01", - "0x2b01f811", - "0xf800bf24", - "0xf8003b01", - "0xbf48cb01", - "0x2b01f800", - "0xb5104770", - "0xf0c03a20", - "0xe8b1800b", - "0x3a205018", - "0x5018e8a0", - "0x5018e8b1", - "0x5018e8a0", - "0xaff5f4bf", - "0x7c02ea5f", - "0xe8b1bf24", - "0xe8a05018", - "0xbf445018", - "0xc018c918", - "0x4010e8bd", - "0x7c82ea5f", - "0xf851bf24", - "0xf8403b04", - "0xbf083b04", - "0x7d24770", - "0xf831bf28", - "0xbf483b02", - "0x2b01f811", - "0xf820bf28", - "0xbf483b02", - "0x2b01f800", - "0xf04f4770", - "0xb5000200", - "0x46944613", - "0x39204696", - "0xe8a0bf22", - "0xe8a0500c", - "0xf1b1500c", - "0xf4bf0120", - "0x709aff7", - "0xe8a0bf28", - "0xbf48500c", - "0xf85dc00c", - "0x89eb04", - "0xf840bf28", - "0xbf082b04", - "0xbf484770", - "0x2b02f820", - "0x4f80f011", - "0xf800bf18", - "0x47702b01", - "0x0", - "0x71000", - "0x70000", - "0x10f00", - "0x78000", - "0x20d00", - "0x7c000", - "0x10e00", - "0x0", - "0xf1000", - "0xf0000", - "0x10e00", - "0xf4000", - "0x20d00", - "0xf8000", - "0x10f00", - "0x0", - "0x100c00", - "0x10000", - "0xf1000", - "0x0", - "0x100c00", - "0x10000", - "0x1f1000", - "0x0", - "0x100c00", - "0x10000", - "0x3f1000", - "0x0", - "0x100c00", - "0x10000", - "0x7e1000", - "0x7f000", - "0x100c00", - "0x0", - "0x100c00", - "0x10000", - "0xfe1000", - "0xff000", - "0x100c00", - "0x0", - "0x100c00", - "0x10000", - "0x1fe1000", - "0x1ff000", - "0x100c00", - "0x3c7c0c0c", - "0x3c3c3c3c", - "0x3c3c", - "0x1fe000", - "0x4f301", - "0x6000", - "0x4f301", - "0x1f0000", - "0x1f100", - "0x8000", - "0x1f100", - "0x1e0000", - "0x1ef000", - "0x3fe000", - "0x4f301", - "0x6000", - "0x4f301", - "0x3f0000", - "0x1f100", - "0x8000", - "0x1f100", - "0x3e0000", - "0x3ef000", - "0x7fe000", - "0x4f301", - "0x6000", - "0x4f301", - "0x7f0000", - "0x1f100", - "0x8000", - "0x1f100", - "0x7e0000", - "0x7ef000", - "0x0", - "0x0", - "0x6802005", - "0xbef6f7fd", - "0x0" - ], - "load_address": "0x10000000", - "min_program_length": "0x200", - "page_buffers": [ - "0x10004000", - "0x10004800" - ], - "pc_eraseAll": "0x1000007f", - "pc_erase_sector": "0x1000009f", - "pc_init": "0x10002234", - "pc_program_page": "0x100000cd", - "static_base": "0x10002240" - }, - "memory_map": [ - { - "blocksize": "0x0", - "end": "0x1001ffff", - "length": "0x20000", - "name": "ram", - "start": "0x10000000", - "type": "ram" - }, - { - "blocksize": "0x0", - "end": "0x10091fff", - "length": "0x12000", - "name": "ram", - "start": "0x10080000", - "type": "ram" - }, - { - "blocksize": "0x400", - "end": "0x17ffffff", - "length": "0x4000000", - "name": "flash", - "start": "0x14000000", - "type": "flash" - }, - { - "blocksize": "0x0", - "end": "0x20007fff", - "length": "0x8000", - "name": "ram", - "start": "0x20000000", - "type": "ram" - }, - { - "blocksize": "0x0", - "end": "0x2000ffff", - "length": "0x8000", - "name": "ram", - "start": "0x20008000", - "type": "ram" - } - ], - "target_name": "lpc4330" - }, - "2201": { - "flash_algo": { - "analyzer_address": "0x20001000", - "analyzer_supported": true, - "begin_data": "0x20002000", - "begin_stack": "0x20004000", - "instructions": [ - "0xe00abe00", - "0x62d780d", - "0x24084068", - "0xd3000040", - "0x1e644058", - "0x1c49d1fa", - "0x2a001e52", - "0x4770d1f2", - "0x4c11b430", - "0xbc3046a4", - "0x20004760", - "0x20004770", - "0x23004770", - "0x461ab510", - "0x20144619", - "0xfff0f7ff", - "0xbd102000", - "0x2300b510", - "0x461a4601", - "0xf7ff2012", - "0x2000ffe7", - "0x460bbd10", - "0x4601b510", - "0xf7ff2022", - "0x2000ffdf", - "0xbd10", - "0x1fff1001", - "0x0" - ], - "load_address": "0x20000000", - "page_size": "0x100", - "pc_eraseAll": "0x20000033", - "pc_erase_sector": "0x20000045", - "pc_init": "0x2000002b", - "pc_program_page": "0x20000057", - "static_base": "0x2000006c" - }, - "memory_map": [ - { - "blocksize": "0x100", - "end": "0x1ffff", - "length": "0x20000", - "name": "flash", - "start": "0x0", - "type": "flash" - }, - { - "blocksize": "0x0", - "end": "0x20003fff", - "length": "0x4000", - "name": "ram", - "start": "0x20000000", - "type": "ram" - } - ], - "target_name": "w7500" - }, - "7402": { - "flash_algo": { - "analyzer_address": "0x1ffff000", - "analyzer_supported": true, - "begin_data": "0x20003000", - "begin_stack": "0x20001000", - "instructions": [ - "0xe00abe00", - "0x62d780d", - "0x24084068", - "0xd3000040", - "0x1e644058", - "0x1c49d1fa", - "0x2a001e52", - "0x4770d1f2", - "0x4604b570", - "0x4616460d", - "0x5020f24c", - "0x81c84932", - "0x1028f64d", - "0x460881c8", - "0xf0208800", - "0x80080001", - "0x4448482e", - "0xf8dcf000", - "0x2001b108", - "0x2000bd70", - "0x4601e7fc", - "0x47702000", - "0x4929b510", - "0x44484827", - "0xf8b8f000", - "0xb92c4604", - "0x48242100", - "0xf0004448", - "0x4604f9a9", - "0xf837f000", - "0xbd104620", - "0x4604b570", - "0x4448481e", - "0x46214b1e", - "0xf00068c2", - "0x4605f85d", - "0x481ab93d", - "0x23004448", - "0x68c24621", - "0xf946f000", - "0xf0004605", - "0x4628f820", - "0xb5febd70", - "0x460c4605", - "0x46234616", - "0x46294632", - "0x44484810", - "0xf8f8f000", - "0xb9674607", - "0x22012000", - "0x2000e9cd", - "0x46224633", - "0x90024629", - "0x44484809", - "0xf984f000", - "0xf0004607", - "0x4638f802", - "0x4807bdfe", - "0xf4206840", - "0xf5000070", - "0x49040070", - "0x47706048", - "0x40052000", - "0x4", - "0x6b65666b", - "0x4001f000", - "0x4a0e2070", - "0x20807010", - "0xbf007010", - "0x7800480b", - "0x280009c0", - "0x4809d0fa", - "0xf0017801", - "0xb1080020", - "0x47702067", - "0x10f001", - "0x2068b108", - "0xf001e7f9", - "0xb1080001", - "0xe7f42069", - "0xe7f22000", - "0x40020000", - "0x4df0e92d", - "0x460d4604", - "0x469a4690", - "0xf0004650", - "0x4606f891", - "0x4630b116", - "0x8df0e8bd", - "0x46422310", - "0x46204629", - "0xf86cf000", - "0xb10e4606", - "0xe7f34630", - "0x8eb05", - "0x68e01e47", - "0xf1f0fbb7", - "0x7011fb00", - "0x68e0b140", - "0xf0f0fbb7", - "0xb01f100", - "0xfb0068e0", - "0x1e47f00b", - "0x480be011", - "0x68004478", - "0x20096005", - "0x71c84909", - "0xffacf7ff", - "0x69a04606", - "0x69a0b108", - "0xb1064780", - "0x68e0e003", - "0x42bd4405", - "0xbf00d9eb", - "0xe7c94630", - "0x2ec", - "0x40020000", - "0x4604b570", - "0x4628460d", - "0xf84ef000", - "0xb10e4606", - "0xbd704630", - "0x2004b90c", - "0x2044e7fb", - "0x71c84902", - "0xff88f7ff", - "0xe7f5", - "0x40020000", - "0xb9094601", - "0x47702004", - "0x6cc04826", - "0x6003f3c0", - "0x447b4b25", - "0x10f833", - "0xb90a0302", - "0xe7f22064", - "0x60082000", - "0x2002604a", - "0x2c06088", - "0x200060c8", - "0x61486108", - "0xbf006188", - "0x4602e7e5", - "0x2004b90a", - "0x61914770", - "0xe7fb2000", - "0x4604b530", - "0x2004b90c", - "0x1e58bd30", - "0xb9104008", - "0x40101e58", - "0x2065b108", - "0x6820e7f6", - "0xd8054288", - "0x500e9d4", - "0x188d4428", - "0xd20142a8", - "0xe7eb2066", - "0xe7e92000", - "0x480b4601", - "0xd0014281", - "0x4770206b", - "0xe7fc2000", - "0xb90b4603", - "0x47702004", - "0xd801290f", - "0xd0012a04", - "0xe7f82004", - "0xe7f62000", - "0x40048000", - "0x25a", - "0x6b65666b", - "0x41f0e92d", - "0x46884607", - "0x461d4614", - "0x2004b914", - "0x81f0e8bd", - "0x462a2308", - "0x46384641", - "0xffbcf7ff", - "0xb10e4606", - "0xe7f34630", - "0x4812e01f", - "0x68004478", - "0x8000f8c0", - "0x490fcc01", - "0x390c4479", - "0x60486809", - "0x490ccc01", - "0x39184479", - "0x60886809", - "0x490a2007", - "0xf7ff71c8", - "0x4606ff01", - "0xb10869b8", - "0x478069b8", - "0xe004b106", - "0x808f108", - "0x2d003d08", - "0xbf00d1dd", - "0xe7cd4630", - "0x1b0", - "0x40020000", - "0x4dffe92d", - "0x4682b082", - "0x2310460c", - "0x46504621", - "0xf7ff9a04", - "0x4683ff83", - "0xf00f1bb", - "0x4658d003", - "0xe8bdb006", - "0xe9da8df0", - "0xfbb00101", - "0x4260f7f1", - "0x40084279", - "0x42a54245", - "0x443dd100", - "0xe0229e04", - "0x804eba5", - "0xd90045b0", - "0xea4f46b0", - "0x90011018", - "0x4478480f", - "0x60046800", - "0x490e2001", - "0x980171c8", - "0x72c80a00", - "0x72889801", - "0x72489805", - "0xfeb6f7ff", - "0xf1bb4683", - "0xd0010f00", - "0xe7d14658", - "0x608eba6", - "0x443d4444", - "0x2e00bf00", - "0x2000d1da", - "0xe7c8", - "0x10e", - "0x40020000", - "0x4604b570", - "0xb90c460d", - "0xbd702004", - "0x49032040", - "0x460871c8", - "0xf7ff7185", - "0xe7f6fe95", - "0x40020000", - "0x4dffe92d", - "0x4617460c", - "0xe9dd461d", - "0xf8ddb80c", - "0xb91da038", - "0xb0042004", - "0x8df0e8bd", - "0x463a2304", - "0x98004621", - "0xff1ef7ff", - "0xb10e4606", - "0xe7f24630", - "0x4814e022", - "0x68004478", - "0x20026004", - "0x71c84912", - "0xf8804608", - "0x490fb00b", - "0x39144479", - "0x68096828", - "0xf7ff6088", - "0x4606fe67", - "0xf1b8b15e", - "0xd0010f00", - "0x4000f8c8", - "0xf00f1ba", - "0x2000d002", - "0xf8ca", - "0x1f3fe004", - "0x1d241d2d", - "0xd1da2f00", - "0x4630bf00", - "0xe7c9", - "0x74", - "0x40020000", - "0x0", - "0x80000", - "0x100000", - "0x200000", - "0x400000", - "0x800000", - "0x1000000", - "0x1000000", - "0x40020004", - "0x0" - ], - "load_address": "0x20000000", - "min_program_length": "0x8", - "page_buffers": [ - "0x20003000", - "0x20004000" - ], - "pc_eraseAll": "0x20000059", - "pc_erase_sector": "0x2000007d", - "pc_init": "0x20000021", - "pc_program_page": "0x200000ab", - "static_base": "0x20000494" - }, - "memory_map": [ - { - "blocksize": "0x1000", - "end": "0xfffff", - "length": "0x100000", - "name": "flash", - "start": "0x0", - "type": "flash" - }, - { - "blocksize": "0x0", - "end": "0x2002ffff", - "length": "0x40000", - "name": "ram", - "start": "0x1fff0000", - "type": "ram" - } - ], - "target_name": "k64f" - }, - "9004": { - "flash_algo": { - "analyzer_address": "0x10002000", - "analyzer_supported": true, - "begin_data": "0x2007c000", - "begin_stack": "0x10001000", - "instructions": [ - "0xe00abe00", - "0x62d780d", - "0x24084068", - "0xd3000040", - "0x1e644058", - "0x1c49d1fa", - "0x2a001e52", - "0x4770d1f2", - "0x7803e005", - "0x42931c40", - "0x2001d001", - "0x1e494770", - "0x2000d2f7", - "0x4770", - "0x28100b00", - "0x210ed302", - "0xd0eb01", - "0x486c4770", - "0x7801b510", - "0x102f021", - "0x22aa7001", - "0x23557302", - "0x78017303", - "0x101f021", - "0x73027001", - "0xf8d07303", - "0xf0411120", - "0xf8c00120", - "0xf1a01120", - "0xf8d00080", - "0x64911a0", - "0xf100d5fb", - "0x24010080", - "0x408cf880", - "0x113f04f", - "0x73026041", - "0x78017303", - "0x101f041", - "0x73027001", - "0xf1a07303", - "0xf8d00080", - "0x1491088", - "0xf100d5fb", - "0x2107006d", - "0x1097f880", - "0x109f04f", - "0x109bf880", - "0xf0417cc1", - "0x74c10102", - "0x77c377c2", - "0x4c2df800", - "0xf64e494b", - "0x44492060", - "0xf04f6008", - "0xbd100000", - "0x47702000", - "0x41f0e92d", - "0x20324c46", - "0x2500444c", - "0xe884271d", - "0xf10400a1", - "0x4e430114", - "0x46204688", - "0x696047b0", - "0x2034b960", - "0xa1e884", - "0x4641483c", - "0x68004448", - "0x462060e0", - "0x696047b0", - "0xd0002800", - "0xe8bd2001", - "0xe92d81f0", - "0xf7ff41f0", - "0x4d35ff87", - "0x444d4604", - "0xe9c52032", - "0xf1050400", - "0x4e320114", - "0x4628460f", - "0x47b060ac", - "0xb9686968", - "0xe9c52034", - "0x482b0400", - "0x444860ac", - "0x68004639", - "0x462860e8", - "0x696847b0", - "0xd0dc2800", - "0xe7da2001", - "0x41f0e92d", - "0x46140006", - "0x4925d11d", - "0x2fcf8d4", - "0xd03a4288", - "0x42884923", - "0x4923d037", - "0xd0344288", - "0x4131ea4f", - "0xd0304288", - "0x100e9d4", - "0xe9d44408", - "0x44111202", - "0x69214408", - "0x69614408", - "0x69a14408", - "0x42404408", - "0x463061e0", - "0xff42f7ff", - "0x21324d12", - "0x4f12444d", - "0x1000e9c5", - "0x114f105", - "0x468860a8", - "0x47b84628", - "0xb9806968", - "0xe9c52033", - "0xf44f0600", - "0xe9c56080", - "0x48074002", - "0x44484641", - "0x61286800", - "0x47b84628", - "0x28006968", - "0x2001d095", - "0xe793", - "0x400fc080", - "0x4", - "0x8", - "0x1fff1ff1", - "0x4e697370", - "0x12345678", - "0x87654321", - "0x0", - "0x0" - ], - "load_address": "0x10000000", - "min_program_length": "0x100", - "pc_eraseAll": "0x100000e1", - "pc_erase_sector": "0x10000123", - "pc_init": "0x10000047", - "pc_program_page": "0x10000169", - "static_base": "0x10000214" - }, - "memory_map": [ - { - "blocksize": "0x1000", - "end": "0xffff", - "length": "0x10000", - "name": "flash", - "start": "0x0", - "type": "flash" - }, - { - "blocksize": "0x8000", - "end": "0x7ffff", - "length": "0x70000", - "name": "flash", - "start": "0x10000", - "type": "flash" - }, - { - "blocksize": "0x0", - "end": "0x10007fff", - "length": "0x8000", - "name": "ram", - "start": "0x10000000", - "type": "ram" - }, - { - "blocksize": "0x0", - "end": "0x20083fff", - "length": "0x8000", - "name": "ram", - "start": "0x2007c000", - "type": "ram" - } - ], - "target_name": "lpc1768" - }, - "9009": { - "flash_algo": { - "analyzer_address": "0x20003000", - "analyzer_supported": true, - "begin_data": "0x20002000", - "begin_stack": "0x20001000", - "instructions": [ - "0xe00abe00", - "0x62d780d", - "0x24084068", - "0xd3000040", - "0x1e644058", - "0x1c49d1fa", - "0x2a001e52", - "0x4770d1f2", - "0x47702000", - "0x47702000", - "0x4c26b570", - "0x60602002", - "0x60e02001", - "0x68284d24", - "0xd00207c0", - "0x60602000", - "0xf000bd70", - "0xe7f6f82c", - "0x4c1eb570", - "0x60612102", - "0x4288491e", - "0x2001d302", - "0xe0006160", - "0x4d1a60a0", - "0xf81df000", - "0x7c06828", - "0x2000d0fa", - "0xbd706060", - "0x4605b5f8", - "0x4813088e", - "0x46142101", - "0x4f126041", - "0xc501cc01", - "0x7c06838", - "0x1e76d006", - "0x480dd1f8", - "0x60412100", - "0xbdf84608", - "0xf801f000", - "0x480ce7f2", - "0x6006840", - "0xd00b0e00", - "0x6849490a", - "0xd0072900", - "0x4a0a4909", - "0xd00007c3", - "0x1d09600a", - "0xd1f90840", - "0x4770", - "0x4001e500", - "0x4001e400", - "0x10001000", - "0x40010400", - "0x40010500", - "0x40010600", - "0x6e524635", - "0x0" - ], - "load_address": "0x20000000", - "min_program_length": "0x4", - "page_buffers": [ - "0x20002000", - "0x20002400" - ], - "pc_eraseAll": "0x20000029", - "pc_erase_sector": "0x20000049", - "pc_init": "0x20000021", - "pc_program_page": "0x20000071", - "static_base": "0x20000170" - }, - "memory_map": [ - { - "blocksize": "0x400", - "end": "0x3ffff", - "length": "0x40000", - "name": "flash", - "start": "0x0", - "type": "flash" - }, - { - "blocksize": "0x100", - "end": "0x100010ff", - "length": "0x100", - "name": "flash", - "start": "0x10001000", - "type": "flash" - }, - { - "blocksize": "0x0", - "end": "0x20003fff", - "length": "0x4000", - "name": "ram", - "start": "0x20000000", - "type": "ram" - } - ], - "target_name": "nrf51" - }, - "9012": { - "flash_algo": { - "analyzer_address": "0x20003000", - "analyzer_supported": true, - "begin_data": "0x20002000", - "begin_stack": "0x20001000", - "instructions": [ - "0xe00abe00", - "0x62d780d", - "0x24084068", - "0xd3000040", - "0x1e644058", - "0x1c49d1fa", - "0x2a001e52", - "0x4770d1f2", - "0x47702000", - "0x47702000", - "0x4c26b570", - "0x60602002", - "0x60e02001", - "0x68284d24", - "0xd00207c0", - "0x60602000", - "0xf000bd70", - "0xe7f6f82c", - "0x4c1eb570", - "0x60612102", - "0x4288491e", - "0x2001d302", - "0xe0006160", - "0x4d1a60a0", - "0xf81df000", - "0x7c06828", - "0x2000d0fa", - "0xbd706060", - "0x4605b5f8", - "0x4813088e", - "0x46142101", - "0x4f126041", - "0xc501cc01", - "0x7c06838", - "0x1e76d006", - "0x480dd1f8", - "0x60412100", - "0xbdf84608", - "0xf801f000", - "0x480ce7f2", - "0x6006840", - "0xd00b0e00", - "0x6849490a", - "0xd0072900", - "0x4a0a4909", - "0xd00007c3", - "0x1d09600a", - "0xd1f90840", - "0x4770", - "0x4001e500", - "0x4001e400", - "0x10001000", - "0x40010400", - "0x40010500", - "0x40010600", - "0x6e524635", - "0x0" - ], - "load_address": "0x20000000", - "min_program_length": "0x4", - "page_buffers": [ - "0x20002000", - "0x20002400" - ], - "pc_eraseAll": "0x20000029", - "pc_erase_sector": "0x20000049", - "pc_init": "0x20000021", - "pc_program_page": "0x20000071", - "static_base": "0x20000170" - }, - "memory_map": [ - { - "blocksize": "0x400", - "end": "0x3ffff", - "length": "0x40000", - "name": "flash", - "start": "0x0", - "type": "flash" - }, - { - "blocksize": "0x100", - "end": "0x100010ff", - "length": "0x100", - "name": "flash", - "start": "0x10001000", - "type": "flash" - }, - { - "blocksize": "0x0", - "end": "0x20003fff", - "length": "0x4000", - "name": "ram", - "start": "0x20000000", - "type": "ram" - } - ], - "target_name": "nrf51" - }, - "9900": { - "flash_algo": { - "analyzer_address": "0x20003000", - "analyzer_supported": true, - "begin_data": "0x20002000", - "begin_stack": "0x20001000", - "instructions": [ - "0xe00abe00", - "0x62d780d", - "0x24084068", - "0xd3000040", - "0x1e644058", - "0x1c49d1fa", - "0x2a001e52", - "0x4770d1f2", - "0x47702000", - "0x47702000", - "0x4c26b570", - "0x60602002", - "0x60e02001", - "0x68284d24", - "0xd00207c0", - "0x60602000", - "0xf000bd70", - "0xe7f6f82c", - "0x4c1eb570", - "0x60612102", - "0x4288491e", - "0x2001d302", - "0xe0006160", - "0x4d1a60a0", - "0xf81df000", - "0x7c06828", - "0x2000d0fa", - "0xbd706060", - "0x4605b5f8", - "0x4813088e", - "0x46142101", - "0x4f126041", - "0xc501cc01", - "0x7c06838", - "0x1e76d006", - "0x480dd1f8", - "0x60412100", - "0xbdf84608", - "0xf801f000", - "0x480ce7f2", - "0x6006840", - "0xd00b0e00", - "0x6849490a", - "0xd0072900", - "0x4a0a4909", - "0xd00007c3", - "0x1d09600a", - "0xd1f90840", - "0x4770", - "0x4001e500", - "0x4001e400", - "0x10001000", - "0x40010400", - "0x40010500", - "0x40010600", - "0x6e524635", - "0x0" - ], - "load_address": "0x20000000", - "min_program_length": "0x4", - "page_buffers": [ - "0x20002000", - "0x20002400" - ], - "pc_eraseAll": "0x20000029", - "pc_erase_sector": "0x20000049", - "pc_init": "0x20000021", - "pc_program_page": "0x20000071", - "static_base": "0x20000170" - }, - "memory_map": [ - { - "blocksize": "0x400", - "end": "0x3ffff", - "length": "0x40000", - "name": "flash", - "start": "0x0", - "type": "flash" - }, - { - "blocksize": "0x100", - "end": "0x100010ff", - "length": "0x100", - "name": "flash", - "start": "0x10001000", - "type": "flash" - }, - { - "blocksize": "0x0", - "end": "0x20003fff", - "length": "0x4000", - "name": "ram", - "start": "0x20000000", - "type": "ram" - } - ], - "target_name": "nrf51" - }, - "C004": { - "flash_algo": { - "analyzer_address": "0x1fffe000", - "analyzer_supported": true, - "begin_data": "0x20001c00", - "begin_stack": "0x20000c00", - "instructions": [ - "0xe00abe00", - "0x62d780d", - "0x24084068", - "0xd3000040", - "0x1e644058", - "0x1c49d1fa", - "0x2a001e52", - "0x4770d1f2", - "0x4604b570", - "0x4616460d", - "0x5020f24c", - "0x81c84932", - "0x1028f64d", - "0x460881c8", - "0xf0208800", - "0x80080001", - "0x4448482e", - "0xf8dcf000", - "0x2001b108", - "0x2000bd70", - "0x4601e7fc", - "0x47702000", - "0x4929b510", - "0x44484827", - "0xf8b8f000", - "0xb92c4604", - "0x48242100", - "0xf0004448", - "0x4604f9a3", - "0xf837f000", - "0xbd104620", - "0x4604b570", - "0x4448481e", - "0x46214b1e", - "0xf00068c2", - "0x4605f85d", - "0x481ab93d", - "0x23004448", - "0x68c24621", - "0xf940f000", - "0xf0004605", - "0x4628f820", - "0xb5febd70", - "0x460c4605", - "0x46234616", - "0x46294632", - "0x44484810", - "0xf8f8f000", - "0xb9674607", - "0x22012000", - "0x2000e9cd", - "0x46224633", - "0x90024629", - "0x44484809", - "0xf97ef000", - "0xf0004607", - "0x4638f802", - "0x4807bdfe", - "0xf4206840", - "0xf5000070", - "0x49040070", - "0x47706048", - "0x40052000", - "0x4", - "0x6b65666b", - "0x4001f000", - "0x4a0e2070", - "0x20807010", - "0xbf007010", - "0x7800480b", - "0x280009c0", - "0x4809d0fa", - "0xf0017801", - "0xb1080020", - "0x47702067", - "0x10f001", - "0x2068b108", - "0xf001e7f9", - "0xb1080001", - "0xe7f42069", - "0xe7f22000", - "0x40020000", - "0x4df0e92d", - "0x460d4604", - "0x469a4690", - "0xf0004650", - "0x4606f891", - "0x4630b116", - "0x8df0e8bd", - "0x46422304", - "0x46204629", - "0xf86cf000", - "0xb10e4606", - "0xe7f34630", - "0x8eb05", - "0x68e01e47", - "0xf1f0fbb7", - "0x7011fb00", - "0x68e0b140", - "0xf0f0fbb7", - "0xb01f100", - "0xfb0068e0", - "0x1e47f00b", - "0x480be011", - "0x68004478", - "0x20096005", - "0x71c84909", - "0xffacf7ff", - "0x69a04606", - "0x69a0b108", - "0xb1064780", - "0x68e0e003", - "0x42bd4405", - "0xbf00d9eb", - "0xe7c94630", - "0x2e0", - "0x40020000", - "0x4604b570", - "0x4628460d", - "0xf84ef000", - "0xb10e4606", - "0xbd704630", - "0x2004b90c", - "0x2044e7fb", - "0x71c84902", - "0xff88f7ff", - "0xe7f5", - "0x40020000", - "0xb9094601", - "0x47702004", - "0x6cc04826", - "0x6003f3c0", - "0x447b4b25", - "0x10f833", - "0xb90a0302", - "0xe7f22064", - "0x60082000", - "0x2001604a", - "0x2806088", - "0x200060c8", - "0x61486108", - "0xbf006188", - "0x4602e7e5", - "0x2004b90a", - "0x61914770", - "0xe7fb2000", - "0x4604b530", - "0x2004b90c", - "0x1e58bd30", - "0xb9104008", - "0x40101e58", - "0x2065b108", - "0x6820e7f6", - "0xd8054288", - "0x500e9d4", - "0x188d4428", - "0xd20142a8", - "0xe7eb2066", - "0xe7e92000", - "0x480b4601", - "0xd0014281", - "0x4770206b", - "0xe7fc2000", - "0xb90b4603", - "0x47702004", - "0xd801290f", - "0xd0012a04", - "0xe7f82004", - "0xe7f62000", - "0x40048000", - "0x24e", - "0x6b65666b", - "0x41f0e92d", - "0x46884607", - "0x461d4614", - "0x2004b914", - "0x81f0e8bd", - "0x462a2304", - "0x46384641", - "0xffbcf7ff", - "0xb10e4606", - "0xe7f34630", - "0x480fe019", - "0x68004478", - "0x8000f8c0", - "0x490ccc01", - "0x390c4479", - "0x60486809", - "0x490a2006", - "0xf7ff71c8", - "0x4606ff07", - "0xb10869b8", - "0x478069b8", - "0xe004b106", - "0x804f108", - "0x2d001f2d", - "0xbf00d1e3", - "0xe7d34630", - "0x1a4", - "0x40020000", - "0x4dffe92d", - "0x4682b082", - "0x2304460c", - "0x46504621", - "0xf7ff9a04", - "0x4683ff89", - "0xf00f1bb", - "0x4658d003", - "0xe8bdb006", - "0xe9da8df0", - "0xfbb00101", - "0x4260f7f1", - "0x40084279", - "0x42a54245", - "0x443dd100", - "0xe0229e04", - "0x804eba5", - "0xd90045b0", - "0xea4f46b0", - "0x90010098", - "0x4478480f", - "0x60046800", - "0x490e2001", - "0x980171c8", - "0x72c80a00", - "0x72889801", - "0x72489805", - "0xfebcf7ff", - "0xf1bb4683", - "0xd0010f00", - "0xe7d14658", - "0x608eba6", - "0x443d4444", - "0x2e00bf00", - "0x2000d1da", - "0xe7c8", - "0x10e", - "0x40020000", - "0x4604b570", - "0xb90c460d", - "0xbd702004", - "0x49032040", - "0x460871c8", - "0xf7ff7185", - "0xe7f6fe9b", - "0x40020000", - "0x4dffe92d", - "0x4617460c", - "0xe9dd461d", - "0xf8ddb80c", - "0xb91da038", - "0xb0042004", - "0x8df0e8bd", - "0x463a2304", - "0x98004621", - "0xff24f7ff", - "0xb10e4606", - "0xe7f24630", - "0x4814e022", - "0x68004478", - "0x20026004", - "0x71c84912", - "0xf8804608", - "0x490fb00b", - "0x39144479", - "0x68096828", - "0xf7ff6088", - "0x4606fe6d", - "0xf1b8b15e", - "0xd0010f00", - "0x4000f8c8", - "0xf00f1ba", - "0x2000d002", - "0xf8ca", - "0x1f3fe004", - "0x1d241d2d", - "0xd1da2f00", - "0x4630bf00", - "0xe7c9", - "0x74", - "0x40020000", - "0x0", - "0x80000", - "0x100000", - "0x200000", - "0x400000", - "0x800000", - "0x1000000", - "0x1000000", - "0x40020004", - "0x0" - ], - "load_address": "0x20000000", - "min_program_length": "0x8", - "page_buffers": [ - "0x20001800", - "0x20001c00" - ], - "pc_eraseAll": "0x20000059", - "pc_erase_sector": "0x2000007d", - "pc_init": "0x20000021", - "pc_program_page": "0x200000ab", - "static_base": "0x20000488" - }, - "memory_map": [ - { - "blocksize": "0x400", - "end": "0x1ffff", - "length": "0x20000", - "name": "flash", - "start": "0x0", - "type": "flash" - }, - { - "blocksize": "0x0", - "end": "0x20001fff", - "length": "0x4000", - "name": "ram", - "start": "0x1fffe000", - "type": "ram" - } - ], - "target_name": "k20d50m" - }, - "C006": { - "flash_algo": { - "analyzer_address": "0x20003000", - "analyzer_supported": true, - "begin_data": "0x20002000", - "begin_stack": "0x20001000", - "instructions": [ - "0xe00abe00", - "0x62d780d", - "0x24084068", - "0xd3000040", - "0x1e644058", - "0x1c49d1fa", - "0x2a001e52", - "0x4770d1f2", - "0x47702000", - "0x47702000", - "0x4c26b570", - "0x60602002", - "0x60e02001", - "0x68284d24", - "0xd00207c0", - "0x60602000", - "0xf000bd70", - "0xe7f6f82c", - "0x4c1eb570", - "0x60612102", - "0x4288491e", - "0x2001d302", - "0xe0006160", - "0x4d1a60a0", - "0xf81df000", - "0x7c06828", - "0x2000d0fa", - "0xbd706060", - "0x4605b5f8", - "0x4813088e", - "0x46142101", - "0x4f126041", - "0xc501cc01", - "0x7c06838", - "0x1e76d006", - "0x480dd1f8", - "0x60412100", - "0xbdf84608", - "0xf801f000", - "0x480ce7f2", - "0x6006840", - "0xd00b0e00", - "0x6849490a", - "0xd0072900", - "0x4a0a4909", - "0xd00007c3", - "0x1d09600a", - "0xd1f90840", - "0x4770", - "0x4001e500", - "0x4001e400", - "0x10001000", - "0x40010400", - "0x40010500", - "0x40010600", - "0x6e524635", - "0x0" - ], - "load_address": "0x20000000", - "min_program_length": "0x4", - "page_buffers": [ - "0x20002000", - "0x20002400" - ], - "pc_eraseAll": "0x20000029", - "pc_erase_sector": "0x20000049", - "pc_init": "0x20000021", - "pc_program_page": "0x20000071", - "static_base": "0x20000170" - }, - "memory_map": [ - { - "blocksize": "0x400", - "end": "0x3ffff", - "length": "0x40000", - "name": "flash", - "start": "0x0", - "type": "flash" - }, - { - "blocksize": "0x100", - "end": "0x100010ff", - "length": "0x100", - "name": "flash", - "start": "0x10001000", - "type": "flash" - }, - { - "blocksize": "0x0", - "end": "0x20003fff", - "length": "0x4000", - "name": "ram", - "start": "0x20000000", - "type": "ram" - } - ], - "target_name": "nrf51" - } -} \ No newline at end of file diff --git a/gulpfile.js b/gulpfile.js index c531a470..b4e68aaa 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -1,35 +1,34 @@ -var path = require("path"); -var browserify = require("browserify"); -var del = require("del"); -var merge = require("merge2"); -var buffer = require("vinyl-buffer"); -var source = require("vinyl-source-stream"); -var gulp = require("gulp"); -var sourcemaps = require("gulp-sourcemaps"); -var typedoc = require("gulp-typedoc"); -var typescript = require("gulp-typescript"); -var tslint = require("gulp-tslint"); -var uglify = require("gulp-uglify"); +const path = require("path"); +const browserify = require("browserify"); +const del = require("del"); +const merge = require("merge2"); +const buffer = require("vinyl-buffer"); +const source = require("vinyl-source-stream"); +const tslint = require("tslint"); +const gulp = require("gulp"); +const gulpSourcemaps = require("gulp-sourcemaps"); +const gulpTypedoc = require("gulp-typedoc"); +const gulpTypescript = require("gulp-typescript"); +const gulpTslint = require("gulp-tslint"); // Source -var srcDir = "src"; -var srcFiles = srcDir + "/**/*.ts"; +let srcDir = "src"; +let srcFiles = srcDir + "/**/*.ts"; // Docs -var name = "Mbed Cloud SDK for JavaScript"; -var docsDir = "docs"; +let name = "DAPjs API Documentation"; +let docsDir = "docs"; // Node -var nodeDir = "lib"; -var typesDir = "types"; +let nodeDir = "lib"; +let typesDir = "types"; // Browser bundles -var bundleDir = "bundles"; -var bundleFile = "dap.bundle.js"; -var bundleGlobal = "DAPjs"; -var bundleIgnore = "webusb"; +let bundleDir = "bundles"; +let bundleFile = "dap.bundle.js"; +let bundleGlobal = "DAPjs"; -var watching = false; +let watching = false; // Error handler suppresses exists during watch function handleError(error) { @@ -51,21 +50,22 @@ gulp.task("clean", () => { // Lint the source gulp.task("lint", () => { return gulp.src(srcFiles) - .pipe(tslint({ + .pipe(gulpTslint({ + program: tslint.Linter.createProgram("./tsconfig.json"), formatter: "stylish" })) - .pipe(tslint.report({ + .pipe(gulpTslint.report({ emitError: !watching })) }); // Create documentation -gulp.task("doc", function() { +gulp.task("doc", () => { return gulp.src(srcFiles) - .pipe(typedoc({ + .pipe(gulpTypedoc({ name: name, - readme: srcDir + "/documentation.md", - theme: srcDir + "/theme", + readme: "./README.md", + theme: "./docs-theme", module: "commonjs", target: "es6", mode: "file", @@ -79,13 +79,13 @@ gulp.task("doc", function() { // Build TypeScript source into CommonJS Node modules gulp.task("compile", ["clean"], () => { - var tsResult = gulp.src(srcFiles) - .pipe(sourcemaps.init()) - .pipe(typescript.createProject("tsconfig.json")()) + let tsResult = gulp.src(srcFiles) + .pipe(gulpSourcemaps.init()) + .pipe(gulpTypescript.createProject("tsconfig.json")()) .on("error", handleError); return merge([ - tsResult.js.pipe(sourcemaps.write(".", { + tsResult.js.pipe(gulpSourcemaps.write(".", { sourceRoot: path.relative(nodeDir, srcDir) })).pipe(gulp.dest(nodeDir)), tsResult.dts.pipe(gulp.dest(typesDir)) @@ -97,16 +97,17 @@ gulp.task("bundle", ["compile"], () => { return browserify(nodeDir, { standalone: bundleGlobal }) - .ignore(bundleIgnore) + .ignore("webusb") + .ignore("usb") + .ignore("node-hid") .bundle() .on("error", handleError) .pipe(source(bundleFile)) .pipe(buffer()) - .pipe(sourcemaps.init({ + .pipe(gulpSourcemaps.init({ loadMaps: true })) - //.pipe(uglify()) - .pipe(sourcemaps.write(".", { + .pipe(gulpSourcemaps.write(".", { sourceRoot: path.relative(bundleDir, nodeDir) })) .pipe(gulp.dest(bundleDir)); diff --git a/index.html b/index.html index cf853fdc..21379a89 100644 --- a/index.html +++ b/index.html @@ -1,5 +1,5 @@ - + diff --git a/package.json b/package.json index 6274aa7f..71eb2898 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "dapjs", - "version": "0.5.1", + "version": "1.0.0", "description": "JavaScript interface to on-chip debugger (CMSIS-DAP)", "homepage": "https://github.com/ARMmbed/dapjs", "license": "MIT", @@ -44,6 +44,8 @@ }, "devDependencies": { "@types/node": "^9.3.0", + "@types/node-hid": "^0.7.0", + "@types/usb": "^1.1.6", "@types/w3c-web-usb": "^1.0.0", "browserify": "^14.0.0", "del": "^3.0.0", @@ -53,17 +55,16 @@ "gulp-tslint": "^8.1.3", "gulp-typedoc": "^2.1.2", "gulp-typescript": "^3.2.3", - "gulp-uglify": "^3.0.0", "merge2": "^1.2.0", - "nrf-intel-hex": "^1.3.0", + "node-hid": "^0.7.2", "progress": "^2.0.0", - "ts-node": "^3.2.1", "tslint": "^5.9.1", "tslint-eslint-rules": "^4.1.1", "typedoc": "^0.9.0", "typescript": "~2.6.2", + "usb": "^1.3.1", "vinyl-buffer": "^1.0.1", "vinyl-source-stream": "^2.0.0", - "webusb": "^1.0.3" + "webusb": "^1.0.10" } } diff --git a/server.js b/server.js index 52cc6c54..3d04e2a8 100644 --- a/server.js +++ b/server.js @@ -5,7 +5,7 @@ var app = express(); var port = "3000"; app.use(express.static("./", { - index: "examples/web.html" + index: "examples/daplink-flash/web.html" })); app.listen(port, () => { diff --git a/src/cortex/constants.ts b/src/cortex/constants.ts deleted file mode 100644 index 907a3d0b..00000000 --- a/src/cortex/constants.ts +++ /dev/null @@ -1,138 +0,0 @@ -export const DEFAULT_RUNCODE_TIMEOUT = 10000 /* ms */; - -export const enum CortexSpecialReg { - // Debug Fault Status Register - DFSR = 0xE000ED30, - DFSR_EXTERNAL = (1 << 4), - DFSR_VCATCH = (1 << 3), - DFSR_DWTTRAP = (1 << 2), - DFSR_BKPT = (1 << 1), - DFSR_HALTED = (1 << 0), - - // Debug Exception and Monitor Control Register - DEMCR = 0xE000EDFC, - // DWTENA in armv6 architecture reference manual - DEMCR_TRCENA = (1 << 24), - DEMCR_VC_HARDERR = (1 << 10), - DEMCR_VC_BUSERR = (1 << 8), - DEMCR_VC_CORERESET = (1 << 0), - - // CPUID Register - CPUID = 0xE000ED00, - - // Debug Core Register Selector Register - DCRSR = 0xE000EDF4, - DCRSR_REGWnR = (1 << 16), - DCRSR_REGSEL = 0x1F, - - // Debug Halting Control and Status Register - DHCSR = 0xE000EDF0, - C_DEBUGEN = (1 << 0), - C_HALT = (1 << 1), - C_STEP = (1 << 2), - C_MASKINTS = (1 << 3), - C_SNAPSTALL = (1 << 5), - S_REGRDY = (1 << 16), - S_HALT = (1 << 17), - S_SLEEP = (1 << 18), - S_LOCKUP = (1 << 19), - S_RETIRE_ST = (1 << 24), - S_RESET_ST = (1 << 25), - - // Debug Core Register Data Register - DCRDR = 0xE000EDF8, - - // Coprocessor Access Control Register - CPACR = 0xE000ED88, - CPACR_CP10_CP11_MASK = (3 << 20) | (3 << 22), - - NVIC_AIRCR = (0xE000ED0C), - NVIC_AIRCR_VECTKEY = (0x5FA << 16), - NVIC_AIRCR_VECTRESET = (1 << 0), - NVIC_AIRCR_SYSRESETREQ = (1 << 2), - - DBGKEY = (0xA05F << 16), - - // FPB (breakpoint) - FP_CTRL = (0xE0002000), - FP_CTRL_KEY = (1 << 1), - FP_COMP0 = (0xE0002008), - - // DWT (data watchpoint & trace) - DWT_CTRL = 0xE0001000, - DWT_COMP_BASE = 0xE0001020, - DWT_MASK_OFFSET = 4, - DWT_FUNCTION_OFFSET = 8, - DWT_COMP_BLOCK_SIZE = 0x10, -} - -export const CPUID_IMPLEMENTER_MASK = 0xff000000; -export const CPUID_IMPLEMENTER_POS = 24; -export const CPUID_VARIANT_MASK = 0x00f00000; -export const CPUID_VARIANT_POS = 20; -export const CPUID_ARCHITECTURE_MASK = 0x000f0000; -export const CPUID_ARCHITECTURE_POS = 16; -export const CPUID_PARTNO_MASK = 0x0000fff0; -export const CPUID_PARTNO_POS = 4; -export const CPUID_REVISION_MASK = 0x0000000f; -export const CPUID_REVISION_POS = 0; - -export const enum CPUIDImplementer { - CPUID_IMPLEMENTER_ARM = 0x41, -} - -export const enum ISA { - ARMv6M = 0xC, - ARMv7M = 0xF, -} - -export const ISANames: Map = new Map(); -ISANames.set(ISA.ARMv6M, "ARMv6M"); -ISANames.set(ISA.ARMv7M, "ARMv7M"); - -export const enum CoreType { - CortexM0 = 0xc20, - CortexM1 = 0xc21, - CortexM3 = 0xc23, - CortexM4 = 0xc24, - CortexM0p = 0xc60, -} - -export const CoreNames: Map = new Map(); -CoreNames.set(CoreType.CortexM0, "Cortex-M0"); -CoreNames.set(CoreType.CortexM1, "Cortex-M1"); -CoreNames.set(CoreType.CortexM3, "Cortex-M3"); -CoreNames.set(CoreType.CortexM4, "Cortex-M4"); -CoreNames.set(CoreType.CortexM0p, "Cortex-M0+"); - -export const enum CortexReg { - R0 = 0, - R1 = 1, - R2 = 2, - R3 = 3, - R4 = 4, - R5 = 5, - R6 = 6, - R7 = 7, - R8 = 8, - R9 = 9, - R10 = 10, - R11 = 11, - R12 = 12, - SP = 13, - LR = 14, - PC = 15, - XPSR = 16, - MSP = 17, // Main Stack Pointer - PSP = 18, // Process Stack Pointer - PRIMASK = 20, // &0xff - CONTROL = 20, // &0xff000000 >> 24 -} - -export const enum CoreState { - TARGET_RESET, - TARGET_LOCKUP, - TARGET_SLEEPING, - TARGET_HALTED, - TARGET_RUNNING, -} diff --git a/src/cortex/cortex.ts b/src/cortex/cortex.ts deleted file mode 100644 index e02a44c4..00000000 --- a/src/cortex/cortex.ts +++ /dev/null @@ -1,353 +0,0 @@ -import {DAP} from "../dap/dap"; - -import {Debug} from "../debug/debug"; -import {Memory} from "../memory/memory"; -import {PreparedMemoryCommand} from "../memory/prepared"; -import {assert} from "../util"; - -import { - CoreState, - CoreType, - CortexReg, - CortexSpecialReg, - CPUID_ARCHITECTURE_MASK, - CPUID_ARCHITECTURE_POS, - CPUID_IMPLEMENTER_MASK, - CPUID_IMPLEMENTER_POS, - CPUID_PARTNO_MASK, - CPUID_PARTNO_POS, - CPUIDImplementer, - DEFAULT_RUNCODE_TIMEOUT, - ISA, -} from "./constants"; -import {PreparedCortexMCommand} from "./prepared"; - -/** - * # Cortex M - * - * Manages access to a CPU core, and its associated memory and debug functionality. - * - * > **NOTE:** all of the methods that involve interaction with the CPU core - * > are asynchronous, so must be `await`ed, or explicitly handled as a Promise. - * - * ## Usage - * - * First, let's create an instance of `CortexM`, using an associated _Debug Access - * Port_ (DAP) instance that we created earlier. - * - * ```typescript - * const core = new CortexM(dap); - * ``` - * - * Now, we can halt and resume the core just like this: - * - * > **NOTE:** If you're not using ES2017, you can replace the use of `async` and - * > `await` with direct use of Promises. These examples also need to be run within - * > an `async` function for `async` to be used. - * - * ```typescript - * await core.halt(); - * await core.resume(); - * ``` - * - * Resetting the core is just as easy: - * - * ```typescript - * await core.reset(); - * ``` - * - * You can even halt immediately after reset: - * - * ```typescript - * await core.reset(true); - * ``` - * - * We can also read and write 32-bit values to/from core registers: - * - * ```typescript - * const sp = await core.readCoreRegister(CortexReg.SP); - * - * await core.writeCoreRegister(CortexReg.R0, 0x1000); - * await core.writeCoreRegister(CortexReg.PC, 0x1234); - * ``` - * - * ### See also - * - * For details on debugging and memory features, see the documentation for - * `Debug` and `Memory`. - */ -export class CortexM { - /** - * Read and write to on-chip memory associated with this CPU core. - */ - public readonly memory: Memory; - - /** - * Control the CPU's debugging features. - */ - public readonly debug: Debug; - - /** - * Underlying Debug Access Port (DAP). - */ - private dev: DAP; - - constructor(device: DAP) { - this.dev = device; - this.memory = new Memory(device); - this.debug = new Debug(this); - } - - /** - * Initialise the debug access port on the device, and read the device type. - */ - public async init() { - await this.dev.init(); - - // FIXME: don't run this if security is enabled on the K64F - await this.debug.init(); - await this.readCoreType(); - } - - /** - * Read the current state of the CPU. - * - * @returns A member of the `CoreState` enum corresponding to the current status of the CPU. - */ - public async getState() { - const dhcsr = await this.memory.read32(CortexSpecialReg.DHCSR); - - if (dhcsr & CortexSpecialReg.S_RESET_ST) { - const newDHCSR = await this.memory.read32(CortexSpecialReg.DHCSR); - - if (newDHCSR & CortexSpecialReg.S_RESET_ST && !(newDHCSR & CortexSpecialReg.S_RETIRE_ST)) { - return CoreState.TARGET_RESET; - } - } - - if (dhcsr & CortexSpecialReg.S_LOCKUP) { - return CoreState.TARGET_LOCKUP; - } else if (dhcsr & CortexSpecialReg.S_SLEEP) { - return CoreState.TARGET_SLEEPING; - } else if (dhcsr & CortexSpecialReg.S_HALT) { - return CoreState.TARGET_HALTED; - } else { - return CoreState.TARGET_RUNNING; - } - } - - /** - * Read the CPUID register from the CPU, and interpret its meaning in terms of implementer, - * architecture and core type. - */ - public async readCoreType(): Promise<[CPUIDImplementer, ISA, CoreType]> { - const cpuid = await this.memory.read32(CortexSpecialReg.CPUID); - - const implementer = ((cpuid & CPUID_IMPLEMENTER_MASK) >> CPUID_IMPLEMENTER_POS) as CPUIDImplementer; - const arch = ((cpuid & CPUID_ARCHITECTURE_MASK) >> CPUID_ARCHITECTURE_POS) as ISA; - const coreType = ((cpuid & CPUID_PARTNO_MASK) >> CPUID_PARTNO_POS) as CoreType; - return [implementer, arch, coreType]; - } - - public prepareCommand(): PreparedCortexMCommand { - return new PreparedCortexMCommand(this.dev); - } - - /** - * Read a core register from the CPU (e.g. r0...r15, pc, sp, lr, s0...) - * - * @param no Member of the `CortexReg` enum - an ARM Cortex CPU general-purpose register. - */ - public async readCoreRegister(no: CortexReg) { - await this.memory.write32(CortexSpecialReg.DCRSR, no); - const v = await this.memory.read32(CortexSpecialReg.DHCSR); - assert(v & CortexSpecialReg.S_REGRDY); - return await this.memory.read32(CortexSpecialReg.DCRDR); - } - - /** - * Write a 32-bit word to the specified CPU general-purpose register. - * - * @param no Member of the `CortexReg` enum - an ARM Cortex CPU general-purpose register. - * @param val Value to be written. - */ - public async writeCoreRegister(no: CortexReg, val: number) { - const prep = new PreparedMemoryCommand(this.dev); - - prep.write32(CortexSpecialReg.DCRDR, val); - prep.write32(CortexSpecialReg.DCRSR, no | CortexSpecialReg.DCRSR_REGWnR); - prep.read32(CortexSpecialReg.DHCSR); - const v = (await prep.go())[0]; - - assert(v & CortexSpecialReg.S_REGRDY); - } - - /** - * Halt the CPU core. - */ - public async halt() { - return this.memory.write32( - CortexSpecialReg.DHCSR, - CortexSpecialReg.DBGKEY | CortexSpecialReg.C_DEBUGEN | CortexSpecialReg.C_HALT, - ); - } - - /** - * Resume the CPU core. - */ - public async resume() { - if (await this.isHalted()) { - await this.memory.write32( - CortexSpecialReg.DFSR, - CortexSpecialReg.DFSR_DWTTRAP | CortexSpecialReg.DFSR_BKPT | CortexSpecialReg.DFSR_HALTED, - ); - await this.debug.enable(); - } - } - - /** - * Find out whether the CPU is halted. - */ - public async isHalted() { - const s = await this.status(); - return s.isHalted; - } - - /** - * Read the current status of the CPU. - * - * @returns Object containing the contents of the `DHCSR` register, the `DFSR` register, and a boolean value - * stating the current halted state of the CPU. - */ - public async status() { - const prep = new PreparedMemoryCommand(this.dev); - - prep.read32(CortexSpecialReg.DHCSR); - prep.read32(CortexSpecialReg.DFSR); - - const results = await prep.go(); - - const dhcsr = results[0]; - const dfsr = results[1]; - - return { - dfsr, - dhscr: dhcsr, - isHalted: !!(dhcsr & CortexSpecialReg.S_HALT), - }; - } - - /** - * Reset the CPU core. This currently does a software reset - it is also technically possible to perform a 'hard' - * reset using the reset pin from the debugger. - */ - public async reset(halt = false) { - if (halt) { - await this.halt(); - - // VC_CORERESET causes the core to halt on reset. - const demcr = await this.memory.read32(CortexSpecialReg.DEMCR); - await this.memory.write32(CortexSpecialReg.DEMCR, demcr | CortexSpecialReg.DEMCR_VC_CORERESET); - - await this.softwareReset(); - await this.waitForHalt(); - - // Unset the VC_CORERESET bit - await this.memory.write32(CortexSpecialReg.DEMCR, demcr); - } else { - await this.softwareReset(); - } - } - - /** - * Run specified machine code natively on the device. Assumes usual C calling conventions - * - returns the value of r0 once the program has terminated. The program _must_ terminate - * in order for this function to return. This can be achieved by placing a `bkpt` - * instruction at the end of the function. - * - * @param code array containing the machine code (32-bit words). - * @param address memory address at which to place the code. - * @param pc initial value of the program counter. - * @param lr initial value of the link register. - * @param sp initial value of the stack pointer. - * @param upload should we upload the code before running it. - * @param args set registers r0...rn before running code - * - * @returns A promise for the value of r0 on completion of the function call. - */ - public async runCode( - code: Uint32Array, - address: number, - pc: number, - lr: number, - sp: number, - upload: boolean, - ...args: number[]) { - - // await this.halt(); - - const cmd = this.prepareCommand(); - - cmd.halt(); - - // Point the program counter to the start of the program - cmd.writeCoreRegister(CortexReg.PC, pc); - cmd.writeCoreRegister(CortexReg.LR, lr); - cmd.writeCoreRegister(CortexReg.SP, sp); - - for (let i = 0; i < args.length; i++) { - cmd.writeCoreRegister(i, args[i]); - } - - await cmd.go(); - - // Write the program to memory at the specified address - if (upload) { - await this.memory.writeBlock(address, code); - } - - // Run the program and wait for halt - await this.resume(); - await this.waitForHalt(DEFAULT_RUNCODE_TIMEOUT); // timeout after 10s - - return await this.readCoreRegister(CortexReg.R0); - } - - /** - * Spin until the chip has halted. - */ - public async waitForHalt(timeout = 0) { - return new Promise(async (resolve, reject) => { - let running = true; - - if (timeout > 0) { - setTimeout(() => { - reject("waitForHalt timed out."); - running = false; - }, timeout); - } - - while (running && !(await this.isHalted())) { - /* empty */ - } - - if (running) { - resolve(); - } - }); - } - - private async softwareReset() { - await this.memory.write32( - CortexSpecialReg.NVIC_AIRCR, - CortexSpecialReg.NVIC_AIRCR_VECTKEY | CortexSpecialReg.NVIC_AIRCR_SYSRESETREQ, - ); - - // wait for the system to come out of reset - let dhcsr = await this.memory.read32(CortexSpecialReg.DHCSR); - - while ((dhcsr & CortexSpecialReg.S_RESET_ST) !== 0) { - dhcsr = await this.memory.read32(CortexSpecialReg.DHCSR); - } - } -} diff --git a/src/cortex/prepared.ts b/src/cortex/prepared.ts deleted file mode 100644 index 2d7a7089..00000000 --- a/src/cortex/prepared.ts +++ /dev/null @@ -1,97 +0,0 @@ -import {DAP} from "../dap/dap"; -import {PreparedMemoryCommand} from "../memory/prepared"; - -import {CortexReg, CortexSpecialReg} from "./constants"; - -/** - * # Cortex M: Prepared Command - * - * Allows batching of Cortex M-related commands, such as writing to a register, - * halting and resuming the core. - * - * ## Example - * - * When preparing the sequence of commands, we can use the same API to prepare - * a command as we would to execute them immediately. - * - * ```typescript - * // Note that only the .go method is asynchronous. - * - * const prep = core.prepareCommand(); - * prep.writeCoreRegister(CortexReg.R0, 0x1000); - * prep.writeCoreRegister(CortexReg.R1, 0x0); - * prep.writeCoreRegister(CortexReg.PC, 0x2000000); - * prep.resume(); - * ``` - * - * We can then execute them as efficiently as possible by combining them together - * and executing them like so. - * - * ```typescript - * await prep.go(); - * ``` - * - * The code above is equivalent to the following _non-prepared_ command: - * - * ```typescript - * await core.writeCoreRegister(CortexReg.R0, 0x1000); - * await core.writeCoreRegister(CortexReg.R1, 0x0); - * await core.writeCoreRegister(CortexReg.PC, 0x2000000); - * await core.resume(); - * ``` - * - * Since the batched version of this code avoids making three round-trips to the - * target, we are able to significantly improve performance. This is especially - * noticable when uploading a binary to flash memory, where are large number of - * repetetive commands are being used. - * - * ## Explanation - * - * For a detailed explanation of why prepared commands are used in DAP.js, see the - * documentation for `PreparedDapCommand`. - */ -export class PreparedCortexMCommand { - private cmd: PreparedMemoryCommand; - - constructor(dap: DAP) { - this.cmd = new PreparedMemoryCommand(dap); - } - - /** - * Schedule a 32-bit integer to be written to a core register. - * - * @param no Core register to be written. - * @param val Value to write. - */ - public writeCoreRegister(no: CortexReg, val: number) { - this.cmd.write32(CortexSpecialReg.DCRDR, val); - this.cmd.write32(CortexSpecialReg.DCRSR, no | CortexSpecialReg.DCRSR_REGWnR); - } - - /** - * Schedule a halt command to be written to the CPU. - */ - public halt() { - this.cmd.write32( - CortexSpecialReg.DHCSR, - CortexSpecialReg.DBGKEY | CortexSpecialReg.C_DEBUGEN | CortexSpecialReg.C_HALT, - ); - } - - /** - * Schedule a resume command to be written to the CPU. - */ - public resume() { - this.cmd.write32( - CortexSpecialReg.DFSR, - CortexSpecialReg.DFSR_DWTTRAP | CortexSpecialReg.DFSR_BKPT | CortexSpecialReg.DFSR_HALTED, - ); - } - - /** - * Execute all scheduled commands. - */ - public async go() { - await this.cmd.go(); - } -} diff --git a/src/dap/adi.ts b/src/dap/adi.ts new file mode 100644 index 00000000..75d63879 --- /dev/null +++ b/src/dap/adi.ts @@ -0,0 +1,391 @@ +/* +* DAPjs +* Copyright Arm Limited 2018 +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in all +* copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +*/ + +import { Transport } from "../transport"; +import { Proxy, CmsisDAP, DAPOperation } from "../proxy"; +import { DPRegister, APRegister, CSWMask, BankSelectMask, AbortMask, CtrlStatMask } from "./enums"; +import { DAP } from "./"; +import { DAPTransferMode, DAPPort, DAPProtocol } from "../proxy/enums"; +import { DEFAULT_CLOCK_FREQUENCY } from "../proxy/cmsis-dap"; + +/** + * Arm Debug Interface class + */ +export class ADI implements DAP { + + private selectedAddress: number = null; + private cswValue: number = null; + private proxy: Proxy; + + /** + * ADI constructor + * @param transport Debug transport to use + * @param mode Debug mode to use + * @param clockFrequency Communication clock frequency to use (default 10000000) + */ + constructor(transport: Transport, mode: DAPProtocol, clockFrequency: number); + /** + * ADI constructor + * @param proxy Proxy to use + */ + constructor(proxy: Proxy); + constructor(transportOrDap: Transport | Proxy, mode: DAPProtocol = DAPProtocol.DEFAULT, clockFrequency: number = DEFAULT_CLOCK_FREQUENCY) { + function isTransport(test: Transport | Proxy): test is Transport { + return (test as Transport).open !== undefined; + } + this.proxy = isTransport(transportOrDap) ? new CmsisDAP(transportOrDap, mode, clockFrequency) : transportOrDap; + } + + protected delay(timeout: number): Promise { + return new Promise((resolve, _reject) => { + setTimeout(resolve, timeout); + }); + } + + /** + * Continually run a function until it returns true + * @param fn The function to run + * @param timer The millisecoinds to wait between each run + * @param timeout Optional timeout to wait before giving up and rejecting + * @returns Promise + */ + protected waitDelay(fn: () => Promise, timer: number = 100, timeout: number = 0): Promise { + let running: boolean = true; + + const chain = (condition: boolean): Promise => { + if (running) { + return condition + ? Promise.resolve() + : this.delay(timer) + .then(fn) + .then(chain); + } + }; + + return new Promise((resolve, reject) => { + if (timeout > 0) { + setTimeout(() => { + running = false; + reject("Wait timed out"); + }, timeout); + } + + return chain(false) + .then(() => resolve()); + }); + } + + protected concatTypedArray(arrays: Uint32Array[]): Uint32Array { + // Only one array exists + if (arrays.length === 1) return arrays[0]; + + // Determine array length + let length: number = 0; + for (const array of arrays) { + length += array.length; + } + + // Concat the arrays + const result = new Uint32Array(length); + for (let i = 0, j = 0; i < arrays.length; i++) { + result.set(arrays[i], j); + j += arrays[i].length; + } + + return result; + } + + protected readDPCommand(register: number): DAPOperation[] { + return [{ + mode: DAPTransferMode.READ, + port: DAPPort.DEBUG, + register + }]; + } + + protected writeDPCommand(register: number, value: number): DAPOperation[] { + if (register === DPRegister.SELECT) { + if (value === this.selectedAddress) { + return []; + } + this.selectedAddress = value; + } + + return [{ + mode: DAPTransferMode.WRITE, + port: DAPPort.DEBUG, + register, + value + }]; + } + + protected readAPCommand(register: number): DAPOperation[] { + const address = (register & BankSelectMask.APSEL) | (register & BankSelectMask.APBANKSEL); + + return this.writeDPCommand(DPRegister.SELECT, address).concat({ + mode: DAPTransferMode.READ, + port: DAPPort.ACCESS, + register + }); + } + + protected writeAPCommand(register: number, value: number): DAPOperation[] { + if (register === APRegister.CSW) { + if (value === this.cswValue) { + return []; + } + this.cswValue = value; + } + + const address = (register & BankSelectMask.APSEL) | (register & BankSelectMask.APBANKSEL); + + return this.writeDPCommand(DPRegister.SELECT, address).concat({ + mode: DAPTransferMode.WRITE, + port: DAPPort.ACCESS, + register, + value + }); + } + + protected readMem16Command(register: number): DAPOperation[] { + return this.writeAPCommand(APRegister.CSW, CSWMask.VALUE | CSWMask.SIZE_16) + .concat(this.writeAPCommand(APRegister.TAR, register)) + .concat(this.readAPCommand(APRegister.DRW)); + } + + protected writeMem16Command(register: number, value: number): DAPOperation[] { + return this.writeAPCommand(APRegister.CSW, CSWMask.VALUE | CSWMask.SIZE_16) + .concat(this.writeAPCommand(APRegister.TAR, register)) + .concat(this.writeAPCommand(APRegister.DRW, value)); + } + + protected readMem32Command(register: number): DAPOperation[] { + return this.writeAPCommand(APRegister.CSW, CSWMask.VALUE | CSWMask.SIZE_32) + .concat(this.writeAPCommand(APRegister.TAR, register)) + .concat(this.readAPCommand(APRegister.DRW)); + } + + protected writeMem32Command(register: number, value: number): DAPOperation[] { + return this.writeAPCommand(APRegister.CSW, CSWMask.VALUE | CSWMask.SIZE_32) + .concat(this.writeAPCommand(APRegister.TAR, register)) + .concat(this.writeAPCommand(APRegister.DRW, value as number)); + } + + protected transferSequence(operations: DAPOperation[][]): Promise { + // Flatten operations into single array + const merged = [].concat(...operations); + + let chain = Promise.resolve([]); + + // Split operations into sequences no longer than operation count + while (merged.length) { + const sequence = merged.splice(0, this.proxy.operationCount); + chain = chain.then(results => this.proxy.transfer(sequence).then(result => [...results, result])); + } + + return chain + .then(arrays => this.concatTypedArray(arrays)); + } + + /** + * Connect to target device + * @returns Promise + */ + public connect() { + const mask = CtrlStatMask.CDBGPWRUPACK | CtrlStatMask.CSYSPWRUPACK; + + return this.proxy.connect() + .then(() => this.readDP(DPRegister.DPIDR)) + .then(() => this.transferSequence([ + this.writeDPCommand(DPRegister.ABORT, AbortMask.STKERRCLR), // clear sticky error + this.writeDPCommand(DPRegister.SELECT, APRegister.CSW), // select CTRL_STAT + this.writeDPCommand(DPRegister.CTRL_STAT, CtrlStatMask.CSYSPWRUPREQ | CtrlStatMask.CDBGPWRUPREQ) + ])) + // Wait until system and debug have powered up + .then(() => this.waitDelay(() => { + return this.readDP(DPRegister.CTRL_STAT) + .then(status => ((status & mask) === mask)); + })); + } + + /** + * Disconnect from target device + * @returns Promise + */ + public disconnect(): Promise { + return this.proxy.disconnect(); + } + + /** + * Reconnect to target device + * @returns Promise + */ + public reconnect(): Promise { + return this.disconnect() + .then(() => this.delay(100)) + .then(() => this.connect()); + } + + /** + * Reset target device + * @returns Promise + */ + public reset(): Promise { + return this.proxy.reset(); + } + + /** + * Read from a debug port register + * @param register DP register to read + * @returns Promise of register value + */ + public readDP(register: DPRegister): Promise { + return this.proxy.transfer(this.readDPCommand(register)) + .then(result => result[0]); + } + + /** + * Write to a debug port register + * @param register DP register to write + * @param value Value to write + * @returns Promise + */ + public writeDP(register: DPRegister, value: number): Promise { + return this.proxy.transfer(this.writeDPCommand(register, value)) + .then(() => undefined); + } + + /** + * Read from an access port register + * @param register AP register to read + * @returns Promise of register value + */ + public readAP(register: APRegister): Promise { + return this.proxy.transfer(this.readAPCommand(register)) + .then(result => result[0]); + } + + /** + * Write to an access port register + * @param register AP register to write + * @param value Value to write + * @returns Promise + */ + public writeAP(register: APRegister, value: number): Promise { + return this.proxy.transfer(this.writeAPCommand(register, value)) + .then(() => undefined); + } + + /** + * Read a 16-bit word from a memory access port register + * @param register ID of register to read + * @returns Promise of register data + */ + public readMem16(register: number): Promise { + return this.proxy.transfer(this.readMem16Command(register)) + .then(result => result[0]); + } + + /** + * Write a 16-bit word to a memory access port register + * @param register ID of register to write to + * @param value The value to write + * @returns Promise + */ + public writeMem16(register: number, value: number): Promise { + value = value as number << ((register & 0x02) << 3); + return this.proxy.transfer(this.writeMem16Command(register, value)) + .then(() => undefined); + } + + /** + * Read a 32-bit word from a memory access port register + * @param register ID of register to read + * @returns Promise of register data + */ + public readMem32(register: number): Promise { + return this.proxy.transfer(this.readMem32Command(register)) + .then(result => result[0]); + } + + /** + * Write a 32-bit word to a memory access port register + * @param register ID of register to write to + * @param value The value to write + * @returns Promise + */ + public writeMem32(register: number, value: number): Promise { + return this.proxy.transfer(this.writeMem32Command(register, value)) + .then(() => undefined); + } + + /** + * Read a block of 32-bit words from a memory access port register + * @param register ID of register to read from + * @param count The count of values to read + * @returns Promise of register data + */ + public readBlock(register: number, count: number): Promise { + let chain = this.transferSequence([ + this.writeAPCommand(APRegister.CSW, CSWMask.VALUE | CSWMask.SIZE_32), + this.writeAPCommand(APRegister.TAR, register), + ]) + .then(() => []); + + // Split into requests no longer than block size + let remainder = count; + while (remainder > 0) { + const chunkSize = Math.min(remainder, this.proxy.blockSize); + chain = chain.then(results => this.proxy.transferBlock(DAPPort.ACCESS, APRegister.DRW, chunkSize) + .then(result => [...results, result])); + remainder -= chunkSize; + } + + return chain + .then(arrays => this.concatTypedArray(arrays)); + } + + /** + * Write a block of 32-bit words to a memory access port register + * @param register ID of register to write to + * @param values The values to write + * @returns Promise + */ + public writeBlock(register: number, values: Uint32Array): Promise { + let chain = this.transferSequence([ + this.writeAPCommand(APRegister.CSW, CSWMask.VALUE | CSWMask.SIZE_32), + this.writeAPCommand(APRegister.TAR, register), + ]) + .then(() => undefined); + + // Split values into chunks no longer than block size + let index = 0; + while (index < values.length) { + const chunk = values.slice(index, index + this.proxy.blockSize); + chain = chain.then(() => this.proxy.transferBlock(DAPPort.ACCESS, APRegister.DRW, chunk)); + index += this.proxy.blockSize; + } + + return chain; + } +} diff --git a/src/dap/constants.ts b/src/dap/constants.ts deleted file mode 100644 index 9f0785b8..00000000 --- a/src/dap/constants.ts +++ /dev/null @@ -1,63 +0,0 @@ -export const enum DapRegisters { - CSYSPWRUPACK = 0x80000000, - CDBGPWRUPACK = 0x20000000, - CSYSPWRUPREQ = 0x40000000, - CDBGPWRUPREQ = 0x10000000, - - TRNNORMAL = 0x00000000, - MASKLANE = 0x00000f00, -} - -export const enum Csw { - CSW_SIZE = 0x00000007, - CSW_SIZE8 = 0x00000000, - CSW_SIZE16 = 0x00000001, - CSW_SIZE32 = 0x00000002, - CSW_ADDRINC = 0x00000030, - CSW_NADDRINC = 0x00000000, - CSW_SADDRINC = 0x00000010, - CSW_PADDRINC = 0x00000020, - CSW_DBGSTAT = 0x00000040, - CSW_TINPROG = 0x00000080, - CSW_HPROT = 0x02000000, - CSW_MSTRTYPE = 0x20000000, - CSW_MSTRCORE = 0x00000000, - CSW_MSTRDBG = 0x20000000, - CSW_RESERVED = 0x01000000, - - CSW_VALUE = (CSW_RESERVED | CSW_MSTRDBG | CSW_HPROT | CSW_DBGSTAT | CSW_SADDRINC), -} - -export const enum DapVal { - AP_ACC = 1 << 0, - DP_ACC = 0 << 0, - READ = 1 << 1, - WRITE = 0 << 1, - VALUE_MATCH = 1 << 4, - MATCH_MASK = 1 << 5, -} - -export const enum Reg { - DP_0x0 = 0, - DP_0x4 = 1, - DP_0x8 = 2, - DP_0xC = 3, - AP_0x0 = 4, - AP_0x4 = 5, - AP_0x8 = 6, - AP_0xC = 7, - - IDCODE = Reg.DP_0x0, - ABORT = Reg.DP_0x0, - CTRL_STAT = Reg.DP_0x4, - SELECT = Reg.DP_0x8, - -} - -export const enum ApReg { - CSW = 0x00, - TAR = 0x04, - DRW = 0x0C, - - IDR = 0xFC, -} diff --git a/src/dap/dap.ts b/src/dap/dap.ts deleted file mode 100644 index fa2d2f4d..00000000 --- a/src/dap/dap.ts +++ /dev/null @@ -1,200 +0,0 @@ -import {ApReg, DapVal, Reg, DapRegisters} from "./constants"; -import {PreparedDapCommand} from "./prepared"; - -import {CMSISDAP, DapCmd} from "../transport/cmsis_dap"; -import {IHID} from "../transport/hid"; -import {addInt32, apReg, assert, bank, delay, readUInt32LE, regRequest} from "../util"; - -export class DAP { - public dap: CMSISDAP; - - private dpSelect: number; - private csw: number; - // private idcode: number; - - constructor(private device: IHID) { - this.dap = new CMSISDAP(device); - } - - public async reconnect() { - await this.dap.disconnect(); - await delay(100); - await this.init(); - } - - public async init() { - await this.dap.connect(); - await this.readDp(Reg.IDCODE); - // const n = await this.readDp(Reg.IDCODE); - // this.idcode = n; - - let prep = this.prepareCommand(); - prep.writeReg(Reg.DP_0x0, 1 << 2); // clear sticky error - prep.writeDp(Reg.SELECT, 0); - prep.writeDp(Reg.CTRL_STAT, DapRegisters.CSYSPWRUPREQ | DapRegisters.CDBGPWRUPREQ); - - const m = DapRegisters.CDBGPWRUPACK | DapRegisters.CSYSPWRUPACK; - prep.readDp(Reg.CTRL_STAT); - let v = (await prep.go())[0]; - - while ((v & m) !== m) { - v = await this.readDp(Reg.CTRL_STAT); - } - - prep = this.prepareCommand(); - prep.writeDp( - Reg.CTRL_STAT, - (DapRegisters.CSYSPWRUPREQ | - DapRegisters.CDBGPWRUPREQ | - DapRegisters.TRNNORMAL | - DapRegisters.MASKLANE), - ); - prep.writeDp(Reg.SELECT, 0); - prep.readAp(ApReg.IDR); - - await prep.go(); - } - - public async writeReg(regId: Reg, val: number) { - return this.regOp(regId, val); - } - - public async readReg(regId: Reg) { - const buf = await this.regOp(regId, null); - const v = readUInt32LE(buf, 3); - - return v; - } - - public prepareCommand() { - return new PreparedDapCommand(this.dap); - } - - public async readDp(addr: Reg) { - return this.readReg(addr); - } - - public async readAp(addr: ApReg) { - const prep = this.prepareCommand(); - prep.writeDp(Reg.SELECT, bank(addr)); - prep.readReg(apReg(addr, DapVal.READ)); - - return (await prep.go())[0]; - } - - public writeDp(addr: Reg, data: number) { - if (addr === Reg.SELECT) { - if (data === this.dpSelect) { - return Promise.resolve(); - } - - this.dpSelect = data; - } - - return this.writeReg(addr, data); - } - - public async writeAp(addr: ApReg, data: number) { - if (addr === ApReg.CSW) { - if (data === this.csw) { - return Promise.resolve(); - } - - this.csw = data; - } - - const prep = this.prepareCommand(); - prep.writeDp(Reg.SELECT, bank(addr)); - prep.writeReg(apReg(addr, DapVal.WRITE), data); - - await prep.go(); - } - - public async close() { - return this.device.close(); - } - - public async readRegRepeat(regId: Reg, cnt: number) { - assert(cnt <= 15); - - const request = regRequest(regId); - const sendargs = [0, cnt]; - - for (let i = 0; i < cnt; ++i) { - sendargs.push(request); - } - - const buf = await this.dap.cmdNums(DapCmd.DAP_TRANSFER, sendargs); - - if (buf[1] !== cnt) { - throw new Error(("(many) Bad #trans " + buf[1])); - } else if (buf[2] !== 1) { - throw new Error(("(many) Bad transfer status " + buf[2])); - } - - return buf.subarray(3, 3 + cnt * 4); - } - - public async writeRegRepeat(regId: Reg, data: Uint32Array) { - const remainingLength = 64 - 1 - 1 - 2 - 1; // 14 - assert(data.length <= remainingLength / 4); - - /* - BYTE | BYTE *****| SHORT**********| BYTE *************| WORD *********| - > 0x06 | DAP Index | Transfer Count | Transfer Request | Transfer Data | - |***********|****************|*******************|+++++++++++++++| - */ - - const request = regRequest(regId, true); - const sendargs = [0, data.length, 0, request]; - - data.forEach(d => { - // separate d into bytes - addInt32(sendargs, d); - }); - - const buf = await this.dap.cmdNums(DapCmd.DAP_TRANSFER_BLOCK, sendargs); - - if (buf[3] !== 1) { - throw new Error(("(many-wr) Bad transfer status " + buf[2])); - } - } - - private async regOp(regId: Reg, val: number) { - const request = regRequest(regId, val !== null); - const sendargs = [0, 1, request]; - - if (val !== null) { - addInt32(sendargs, val); - } - - const buf = await this.dap.cmdNums(DapCmd.DAP_TRANSFER, sendargs); - - if (buf[1] !== 1) { - throw new Error(("Bad #trans " + buf[1])); - } else if (buf[2] !== 1) { - if (buf[2] === 2) { - throw new Error(("Transfer wait")); - } - throw new Error(("Bad transfer status " + buf[2])); - } - - return buf; - } - - public async readSerialSettings() { - return this.dap.cmdNums(DapCmd.DAP_VENDOR1, []); - } - - public async initializeSerial(data: number[]) { - return this.dap.cmdNums(DapCmd.DAP_VENDOR2, data); - } - - public async readSerial() { - return this.dap.cmdNums(DapCmd.DAP_VENDOR3, []); - } - - public async writeSerial(data: number[]) { - return this.dap.cmdNums(DapCmd.DAP_VENDOR4, data); - } -} diff --git a/src/dap/enums.ts b/src/dap/enums.ts new file mode 100644 index 00000000..1b4329a1 --- /dev/null +++ b/src/dap/enums.ts @@ -0,0 +1,313 @@ +/* +* DAPjs +* Copyright Arm Limited 2018 +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in all +* copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +*/ + +/** + * Debug Port Registers + * http://infocenter.arm.com/help/topic/com.arm.doc.100230_0004_00_en/Chunk310569109.html#smr1439293850345 + */ +export const enum DPRegister { + /** + * AP Abort register, write only + */ + ABORT = 0x0, + /** + * Debug Port Identification register, read only + */ + DPIDR = 0x0, + /** + * Control/Status register, SELECT.DPBANKSEL 0x0 + */ + CTRL_STAT = 0x4, + /** + * Data Link Control Register, SELECT.DPBANKSEL 0x1 + */ + DLCR = 0x4, + /** + * Read Resend register, read only + */ + RESEND = 0x8, + /** + * AP Select register, write only + */ + SELECT = 0x8, + /** + * Read Buffer register, read only + */ + RDBUFF = 0xC, + // Version 2 + /** + * Target Identification register, read only, SELECT.DPBANKSEL 0x2 + */ + TARGETID = 0x4, + /** + * Data Link Protocol Identification Register, read only, SELECT.DPBANKSEL 0x3 + */ + DLPIDR = 0x4, + /** + * Event Status register, read only, SELECT.DPBANKSEL 0x4 + */ + EVENTSTAT = 0x4, + /** + * Target Selection, write only + */ + TARGETSEL = 0xC +} + +/** + * Access Port Registers + * http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.100230_0004_00_en/smr1439293381481.html + */ +export const enum APRegister { + /** + * Control/Status Word register + */ + CSW = 0x00, + /** + * Transfer Address Register + */ + TAR = 0x04, + /** + * Data Read/Write register + */ + DRW = 0x0C, + /** + * Banked Data register + */ + BD0 = 0x10, + /** + * Banked Data register + */ + BD1 = 0x14, + /** + * Banked Data register + */ + BD2 = 0x18, + /** + * Banked Data register + */ + BD3 = 0x1C, + /** + * Configuration register + */ + CFG = 0xF4, + /** + * Debug Base Address register + */ + ROM = 0xF8, + /** + * Identification Register + */ + IDR = 0xFC +} + +/** + * Abort Register Mask + * @hidden + */ +export const enum AbortMask { + /** + * Generates a DAP abort, that aborts the current AP transaction + */ + DAPABORT = (1 << 0), + /** + * Reserved + */ + STKCMPCLR = (1 << 1), + /** + * Sets the STICKYERR sticky error flag to 0 + */ + STKERRCLR = (1 << 2), + /** + * Sets the WDATAERR write data error flag to 0 + */ + WDERRCLR = (1 << 3), + /** + * Sets the STICKYORUN overrun error flag to 0 + */ + ORUNERRCLR = (1 << 4) +} + +/** + * Control/Status Register Mask + * @hidden + */ +export const enum CtrlStatMask { + /** + * This bit is set to 1 to enable overrun detection. The reset value is 0 + */ + ORUNDETECT = (1 << 0), + /** + * This bit is set to 1 when an overrun occurs, read only + */ + STICKYORUN = (1 << 1), + /** + * Reserved + */ + STICKYCMP = (1 << 4), + /** + * If an error is returned by an access port transaction, this bit is set to 1, read only + */ + STICKYERR = (1 << 5), + /** + * Whether the response to the previous access port read or RDBUFF read was OK, read only + */ + READOK = (1 << 6), + /** + * If a Write Data Error occurs, read only + */ + WDATAERR = (1 << 7), + /** + * Debug reset request, the reset value is 0 + */ + CDBGRSTREQ = (1 << 26), + /** + * Debug reset acknowledge, read only + */ + CDBGRSTACK = (1 << 27), + /** + * Debug powerup request, the reset value is 0 + */ + CDBGPWRUPREQ = (1 << 28), + /** + * Debug powerup acknowledge, read only + */ + CDBGPWRUPACK = (1 << 29), + /** + * System powerup request, the reset value is 0 + */ + CSYSPWRUPREQ = (1 << 30), + /** + * System powerup acknowledge, read only + */ + CSYSPWRUPACK = (1 << 31) +} + +/** + * Control/Status Word Register Mask + * http://infocenter.arm.com/help/topic/com.arm.doc.100165_0201_00_en/Chunk2061626261.html#ric1417175948266 + * @hidden + */ +export const enum CSWMask { + /** + * 8 bits + */ + SIZE_8 = (0 << 0), + /** + * 16 bits + */ + SIZE_16 = (1 << 0), + /** + * 32 bits + */ + SIZE_32 = (1 << 1), + /** + * Auto address increment single + */ + ADDRINC_SINGLE = (1 << 4), + /** + * Auto address increment packed + */ + ADDRINC_PACKED = (1 << 5), + /** + * Indicates the status of the DAPEN port - AHB transfers permitted + */ + DBGSTATUS = (1 << 6), + /** + * Indicates if a transfer is in progress + */ + TRANSINPROG = (1 << 7), + /** + * Reserved + */ + RESERVED = (1 << 24), + /** + * User and Privilege control + */ + HPROT1 = (1 << 25), + /** + * Set to 1 for master type debug + */ + MASTERTYPE = (1 << 29), + /** + * Common mask value + * @hidden + */ + VALUE = ( ADDRINC_SINGLE | DBGSTATUS | RESERVED | HPROT1 | MASTERTYPE ), +} + +/** + * Debug Port Bank Select + * @hidden + */ +export const enum DPBankSelect { + /** + * CTRL/STAT + */ + CTRL_STAT = 0x00, + /** + * DLCR + */ + DLCR = 0x01, + /** + * TARGETID + */ + TARGETID = 0x02, + /** + * DLPIDR + */ + DLPIDR = 0x03, + /** + * EVENTSTAT + */ + EVENTSTAT = 0x04 +} + +/** + * Bank Select Mask + * @hidden + */ +export const enum BankSelectMask { + /** + * Selects the current access port + */ + APSEL = 0xFF000000, + /** + * Selects the active 4-word register window on the current access port + */ + APBANKSEL = 0x000000F0, + /** + * Selects the register that appears at DP register 0x4 + */ + DPBANKSEL = 0x0000000F +} + +/** + * Event Status Mask + * @hidden + */ +export const enum EventStatMask { + /** + * Event status flag, indicates that the processor is halted when set to 0 + */ + EA = 0x01 +} diff --git a/src/dap/index.ts b/src/dap/index.ts new file mode 100644 index 00000000..cd38d486 --- /dev/null +++ b/src/dap/index.ts @@ -0,0 +1,129 @@ +/* +* DAPjs +* Copyright Arm Limited 2018 +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in all +* copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +*/ + +/** + * DAP interface + */ +export interface DAP { + /** + * Connect to target device + * @returns Promise + */ + connect(): Promise; + + /** + * Disconnect from target device + * @returns Promise + */ + disconnect(): Promise; + + /** + * Reconnect to target device + * @returns Promise + */ + reconnect(): Promise; + + /** + * Reset target device + * @returns Promise + */ + reset(): Promise; + + /** + * Read from a debug port register + * @param register ID of register to read + * @returns Promise of register value + */ + readDP(register: number): Promise; + + /** + * Write to a debug port register + * @param register ID of register to write + * @param value Value to write + * @returns Promise + */ + writeDP(register: number, value: number): Promise; + + /** + * Read from an access port register + * @param register ID of register to read + * @returns Promise of register value + */ + readAP(register: number): Promise; + + /** + * Write to an access port register + * @param register ID of register to write + * @param value Value to write + * @returns Promise + */ + writeAP(register: number, value: number): Promise; + + /** + * Read a 16-bit word from a memory access port register + * @param register ID of register to read + * @returns Promise of register data + */ + readMem16(register: number): Promise; + + /** + * Write a 16-bit word to a memory access port register + * @param register ID of register to write to + * @param value The value to write + * @returns Promise + */ + writeMem16(register: number, value: number): Promise; + + /** + * Read a 32-bit word from a memory access port register + * @param register ID of register to read + * @returns Promise of register data + */ + readMem32(register: number): Promise; + + /** + * Write a 32-bit word to a memory access port register + * @param register ID of register to write to + * @param value The value to write + * @returns Promise + */ + writeMem32(register: number, value: number): Promise; + + /** + * Read a block of 32-bit words from a memory access port register + * @param register ID of register to read from + * @param count The count of values to read + * @returns Promise of register data + */ + readBlock(register: number, count: number): Promise; + + /** + * Write a block of 32-bit words to a memory access port register + * @param register ID of register to write to + * @param values The values to write + * @returns Promise + */ + writeBlock(register: number, values: Uint32Array): Promise; +} + +export { ADI } from "./adi"; diff --git a/src/dap/prepared.ts b/src/dap/prepared.ts deleted file mode 100644 index 29c14603..00000000 --- a/src/dap/prepared.ts +++ /dev/null @@ -1,195 +0,0 @@ -import {ApReg, DapVal, Reg} from "./constants"; - -import {CMSISDAP, DapCmd} from "../transport/cmsis_dap"; -import {addInt32, apReg, bank, readUInt32LE, regRequest} from "../util"; - -/** - * # Prepared DAP Command - * - * Batches together multiple Debug Access Port (DAP) commands into one (or more) - * CMSIS-DAP Transfers that can be written together to improve link utilisation. - * - * > **NOTE:** this will not normally need to be used by applications or libraries - * > depending on DAP.js. - * - * ## Architecture - * - * - `PreparedDapCommand` keeps a list of CMSIS-DAP `Transfer` commands. - * - Every time an action is scheduled (writing to or reading from a DP or AP register), - * we check to see if there is any remaining room in the current batch, starting a new - * batch if none is available. - * - When `go` is called, the batches are executed sequentially (so DAP commands are - * executed in the order they were added). - * - * ### Reading Values - * - * Writing values to registers is relatively straight forward, however mixing register - * reads and writes together requires us to keep track of how many commands in - * each batch are read commands. - * - * Once data has successfully been read back from the target, the values read are assembled - * into an array, and returned in the order they requested. This allows `PreparedDapCommand`s - * to be used higher up the stack in places where multiple independent read operations take - * place sequentially. - * - * ### Constructing CMSIS-DAP Commands - * - * We keep track of the number of commands in each batch, so that we can fill in the command - * count field of the `DAP_Transfer`. - */ -export class PreparedDapCommand { - private commands: number[][]; - private readCounts: number[]; - private currentCommand: number; - private commandCounts: number[]; - - private dpSelect: number; - private csw: number; - - constructor(private dap: CMSISDAP) { - this.commands = [[0, 1]]; - this.commandCounts = [0]; - this.currentCommand = 0; - this.readCounts = [0]; - } - - /** - * Schedule a value to be written to an AP or DP register. - * - * @param regId register ID to be written to - * @param value value to be written - */ - public writeReg(regId: Reg, value: number) { - const request = regRequest(regId, true); - - if (this.commands[this.currentCommand].length + 5 > 64) { - // start a new command - this.commands.push([0, 1]); - this.commandCounts.push(0); - this.readCounts.push(0); - this.currentCommand++; - } - - this.commands[this.currentCommand].push(request); - addInt32(this.commands[this.currentCommand], value); - - this.commandCounts[this.currentCommand]++; - } - - /** - * Schedule a value to be read from an AP or DP register. - * @param regId register to read from - */ - public readReg(regId: Reg) { - const request = regRequest(regId, false); - - if (this.commands[this.currentCommand].length + 1 > 64) { - // start a new command - this.commands.push([0, 1]); - this.commandCounts.push(0); - this.readCounts.push(0); - this.currentCommand++; - } - - this.commands[this.currentCommand].push(request); - - this.commandCounts[this.currentCommand]++; - this.readCounts[this.currentCommand]++; - } - - /** - * Schedule multiple values to be written to the same register. - * - * **TODO:** figure out dynamically whether it's better to use DAP_TransferBlock vs - * DAP_Transfer. We should be able to fill up the remaining space in a Transfer - * and then start a TransferBlock _if_ we can fit in _13 or more_ values into the - * TransferBlock. However, the gains from this are marginal unless we're using much - * larger packet sizes than 64 bytes. - * - * @param regId register to write to repeatedly - * @param data array of 32-bit values to be written - */ - public writeRegRepeat(regId: Reg, data: Uint32Array) { - // fill up the rest of the command we have left - data.forEach(cmd => { - this.writeReg(regId, cmd); - }); - } - - /** - * Asynchronously execute the commands scheduled. - */ - public async go(): Promise { - const v: number[] = []; - - for (let i = 0; i < this.commands.length; i++) { - const command = this.commands[i]; - command[1] = this.commandCounts[i]; - - const result = await this.dap.cmdNums(DapCmd.DAP_TRANSFER, command); - - for (let j = 0; j < this.readCounts[i]; j++) { - v.push(readUInt32LE(result, 3 + 4 * j)); - } - } - - return v; - } - - /** - * Schedule a value to be written to a DP register - * - * @param addr Address to write to - * @param data Data to be written - */ - public writeDp(addr: Reg, data: number) { - if (addr === Reg.SELECT) { - if (data === this.dpSelect) { - return Promise.resolve(); - } - - this.dpSelect = data; - } - - return this.writeReg(addr, data); - } - - /** - * Schedule a value to be written to an AP register - * - * @param addr Address to write to - * @param data Data to be written - */ - public writeAp(addr: ApReg, data: number) { - this.writeDp(Reg.SELECT, bank(addr)); - - if (addr === ApReg.CSW) { - if (data === this.csw) { - return Promise.resolve(); - } - - this.csw = data; - } - - this.writeReg(apReg(addr, DapVal.WRITE), data); - } - - /** - * Schedule a DP register to read from - * - * @param addr Address to read from - */ - public readDp(addr: Reg) { - return this.readReg(addr); - } - - /** - * Schedule an AP register to read from - * - * @param addr Address to read from - */ - public readAp(addr: ApReg) { - this.writeDp(Reg.SELECT, bank(addr)); - return this.readReg(apReg(addr, DapVal.READ)); - } -} diff --git a/src/daplink/enums.ts b/src/daplink/enums.ts new file mode 100644 index 00000000..39e4f1c3 --- /dev/null +++ b/src/daplink/enums.ts @@ -0,0 +1,68 @@ +/* +* DAPjs +* Copyright Arm Limited 2018 +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in all +* copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +*/ + +/** + * Vendor-specific commands for DapLink serial access + * @hidden + */ +export const enum DAPLinkSerial { + /** + * Read serial settings + */ + READ_SETTINGS = 0x81, + /** + * Write serial settings + */ + WRITE_SETTINGS = 0x82, + /** + * Read from serial + */ + READ = 0x83, + /** + * Write to serial + */ + WRITE = 0x84 +} + +/** + * Vendor-specific commands for DapLink mass-storage device flashing + * @hidden + */ +export const enum DAPLinkFlash { + /** + * Reset the target + */ + RESET = 0x89, + /** + * Open the MSD + */ + OPEN = 0x8A, + /** + * Close the MSD + */ + CLOSE = 0x8B, + /** + * Write the image + */ + WRITE = 0x8C +} diff --git a/src/daplink/index.ts b/src/daplink/index.ts new file mode 100644 index 00000000..7deb3630 --- /dev/null +++ b/src/daplink/index.ts @@ -0,0 +1,185 @@ +/* +* DAPjs +* Copyright Arm Limited 2018 +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in all +* copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +*/ + +import { CmsisDAP, Proxy } from "../proxy"; +import { DAPLinkFlash, DAPLinkSerial } from "./enums"; + +/** + * @hidden + */ +const DEFAULT_BAUDRATE = 9600; +/** + * @hidden + */ +const SERIAL_DELAY = 200; +/** + * @hidden + */ +const PAGE_SIZE = 62; + +/** + * DAPLink Class + */ +export class DAPLink extends CmsisDAP implements Proxy { + + /** + * Progress event + * @event + */ + public static EVENT_PROGRESS: string = "progress"; + + /** + * Serial read event + * @event + */ + public static EVENT_SERIAL_DATA: string = "serial"; + + private timer: NodeJS.Timer = null; + + /** + * Detect if buffer contains text or binary data + */ + private isBufferBinary(buffer: ArrayBuffer): boolean { + const bufferString: string = String.fromCharCode.apply(null, new Uint16Array(buffer, 0, 50)); + + for (let i = 0; i < bufferString.length; i++) { + const charCode = bufferString.charCodeAt(i); + // 65533 is a code for unknown character + // 0-8 are codes for control characters + if (charCode === 65533 || charCode <= 8) { + return true; + } + } + return false; + } + + private writeBuffer(buffer: ArrayBuffer, offset: number = 0): Promise { + const end = Math.min(buffer.byteLength, offset + PAGE_SIZE); + const page = buffer.slice(offset, end); + const data = new Uint8Array(page.byteLength + 1); + + data.set([page.byteLength]); + data.set(new Uint8Array(page), 1); + + return this.send(DAPLinkFlash.WRITE, data) + .then(() => { + this.emit(DAPLink.EVENT_PROGRESS, offset / buffer.byteLength); + if (end < buffer.byteLength) { + return this.writeBuffer(buffer, end); + } + }); + } + + /** + * Flash the target + * @param buffer The image to flash + * @returns Promise + */ + public flash(buffer: BufferSource): Promise { + function isView(source: ArrayBuffer | ArrayBufferView): source is ArrayBufferView { + return (source as ArrayBufferView).buffer !== undefined; + } + + const arrayBuffer = isView(buffer) ? buffer.buffer : buffer; + const streamType = this.isBufferBinary(arrayBuffer) ? 0 : 1; + + return this.send(DAPLinkFlash.OPEN, new Uint32Array([streamType])) + .then(result => { + // An error occurred + if (result.getUint8(1) !== 0) return; + return this.writeBuffer(arrayBuffer); + }) + .then(() => { + this.emit(DAPLink.EVENT_PROGRESS, 1.0); + return this.send(DAPLinkFlash.CLOSE); + }) + .then(result => { + // An error occurred + if (result.getUint8(1) !== 0) return; + return this.send(DAPLinkFlash.RESET); + }) + .then(() => undefined); + } + + /** + * Get the serial baud rate setting + * @returns Promise of baud rate + */ + public getSerialBaudrate(): Promise { + return this.send(DAPLinkSerial.READ_SETTINGS) + .then(result => { + return result.getUint32(1, true); + }); + } + + /** + * Set the serial baud rate setting + * @param baudrate The baudrate to use (defaults to 9600) + * @returns Promise + */ + public setSerialBaudrate(baudrate: number = DEFAULT_BAUDRATE): Promise { + return this.send(DAPLinkSerial.WRITE_SETTINGS, new Uint32Array([baudrate])) + .then(() => undefined); + } + + /** + * Start listening for serial data + */ + public startSerialRead() { + this.stopSerialRead(); + this.timer = setInterval(() => { + return this.send(DAPLinkSerial.READ) + .then(serialData => { + if (serialData.byteLength > 0) { + // check if there is any data returned from the device + if (serialData.getUint8(1) !== 0) { + const data = String.fromCharCode.apply(null, new Uint8Array(serialData.buffer.slice(1))); + this.emit(DAPLink.EVENT_SERIAL_DATA, data); + } + } + }); + }, SERIAL_DELAY); + } + + /** + * Stop listening for serial data + */ + public stopSerialRead() { + if (this.timer) { + clearInterval(this.timer); + this.timer = null; + } + } + + /** + * Write serial data + * @param data The data to write + * @returns Promise + */ + public serialWrite(data: string): Promise { + const arrayData = data.split("").map((e: string) => e.charCodeAt(0)); + arrayData.unshift(arrayData.length); + return this.send(DAPLinkSerial.WRITE, new Uint16Array(arrayData).buffer) + .then(() => undefined); + } +} diff --git a/src/debug/breakpoint.ts b/src/debug/breakpoint.ts deleted file mode 100644 index 8db6328b..00000000 --- a/src/debug/breakpoint.ts +++ /dev/null @@ -1,42 +0,0 @@ -import {CortexM} from "../cortex/cortex"; - -export interface IBreakpoint { - set(): Promise; - clear(): Promise; -} - -export type DisabledBreakpoint = number; - -export class HWBreakpoint implements IBreakpoint { - constructor(public readonly regAddr: number, private readonly parent: CortexM, public readonly addr: number) { } - - public async set() { - /* set hardware breakpoint */ - const bpMatch = ((this.addr & 0x2) ? 2 : 1) << 30; - await this.parent.memory.write32(this.regAddr, this.addr & 0x1ffffffc | bpMatch | 1); - } - - public async clear() { - /* clear hardware breakpoint */ - await this.parent.memory.write32(this.regAddr, 0); - } -} - -export class SWBreakpoint implements IBreakpoint { - private static BKPT_INSTRUCTION: number = 0xbe00; - - private instruction: number; - - constructor(private readonly parent: CortexM, public readonly addr: number) { } - - public async set() { - // read the instruction from the CPU... - this.instruction = await this.parent.memory.read16(this.addr); - await this.parent.memory.write16(this.addr, SWBreakpoint.BKPT_INSTRUCTION); - } - - public async clear() { - /* clear hardware breakpoint */ - await this.parent.memory.write16(this.addr, this.instruction); - } -} diff --git a/src/debug/debug.ts b/src/debug/debug.ts deleted file mode 100644 index 98e448aa..00000000 --- a/src/debug/debug.ts +++ /dev/null @@ -1,191 +0,0 @@ -import {CortexSpecialReg} from "../cortex/constants"; -import {CortexM} from "../cortex/cortex"; - -import {DisabledBreakpoint, HWBreakpoint, IBreakpoint, SWBreakpoint} from "./breakpoint"; - -/** - * # Debug Interface - * - * Keeps track of breakpoints set on the target, as well as deciding whether to - * use a hardware breakpoint or a software breakpoint. - * - * ## Usage - * - * ```typescript - * const dbg = core.debug; - * - * await dbg.setBreakpoint(0x123456); - * - * // resume the core and wait for the breakpoint - * await core.resume(); - * await core.waitForHalt(); - * - * // step forward one instruction - * await dbg.step(); - * - * // remove the breakpoint - * await dbg.deleteBreakpoint(0x123456); - * ``` - */ -export class Debug { - private core: CortexM; - - // if the breakpoint is disabled, call it a number - private breakpoints: Map; - private availableHWBreakpoints: number[]; - // private totalHWBreakpoints: number; - - private enabled: boolean; - - constructor(core: CortexM) { - this.core = core; - this.enabled = false; - this.availableHWBreakpoints = []; - this.breakpoints = new Map(); - } - - public async init() { - return this.setupFpb(); - } - - /** - * Enable debugging on the target CPU - */ - public async enable() { - await this.core.memory.write32(CortexSpecialReg.DHCSR, CortexSpecialReg.DBGKEY | CortexSpecialReg.C_DEBUGEN); - } - - /** - * Set breakpoints at specified memory addresses. - * - * @param addrs An array of memory addresses at which to set breakpoints. - */ - public async setBreakpoint(addr: number) { - if (this.breakpoints.has(addr)) { - // we already have a breakpoint there. - const breakpoint = this.breakpoints.get(addr); - if (typeof breakpoint !== "number") { - // already enabled - // tslint:disable-next-line:no-console - console.warn(`Breakpoint at ${addr.toString(16)} already enabled.`); - return; - } - } - - let bkpt: IBreakpoint; - - // choose where best to place a breakpoint - if (addr < 0x20000000) { - // we can use a HWBreakpoint - - if (this.availableHWBreakpoints.length > 0) { - if (!this.enabled) { - await this.setFpbEnabled(true); - } - - const regAddr = this.availableHWBreakpoints.pop(); - bkpt = new HWBreakpoint(regAddr, this.core, addr); - } else { - bkpt = new SWBreakpoint(this.core, addr); - } - } else { - bkpt = new SWBreakpoint(this.core, addr); - } - - await bkpt.set(); - this.breakpoints.set(addr, bkpt); - } - - public async deleteBreakpoint(addr: number) { - if (this.breakpoints.has(addr)) { - const bkpt = this.breakpoints.get(addr); - if (typeof bkpt !== "number") { - await bkpt.clear(); - - if (bkpt instanceof HWBreakpoint) { - // return the register address to the pool - this.availableHWBreakpoints.push(bkpt.regAddr); - } - } - - this.breakpoints.delete(addr); - } else { - // tslint:disable-next-line:no-console - console.warn(`Breakpoint at ${addr.toString(16)} does not exist.`); - } - } - - /** - * Step the processor forward by one instruction. - */ - public async step() { - const dhcsr = await this.core.memory.read32(CortexSpecialReg.DHCSR); - - if (!(dhcsr & (CortexSpecialReg.C_STEP | CortexSpecialReg.C_HALT))) { - // tslint:disable-next-line:no-console - console.error("Target is not halted."); - return; - } - - const interruptsMasked = (CortexSpecialReg.C_MASKINTS & dhcsr) !== 0; - - if (!interruptsMasked) { - await this.core.memory.write32( - CortexSpecialReg.DHCSR, - CortexSpecialReg.DBGKEY | - CortexSpecialReg.C_DEBUGEN | - CortexSpecialReg.C_HALT | - CortexSpecialReg.C_MASKINTS, - ); - } - - await this.core.memory.write32( - CortexSpecialReg.DHCSR, - CortexSpecialReg.DBGKEY | - CortexSpecialReg.C_DEBUGEN | - CortexSpecialReg.C_MASKINTS | - CortexSpecialReg.C_STEP, - ); - - await this.core.waitForHalt(); - - await this.core.memory.write32( - CortexSpecialReg.DHCSR, - CortexSpecialReg.DBGKEY | - CortexSpecialReg.C_DEBUGEN | - CortexSpecialReg.C_HALT, - ); - } - - /** - * Set up (and disable) the Flash Patch & Breakpoint unit. It will be enabled when - * the first breakpoint is set. - * - * Also reads the number of available hardware breakpoints. - */ - private async setupFpb() { - // setup FPB (breakpoint) - const fpcr = await this.core.memory.read32(CortexSpecialReg.FP_CTRL); - const nbCode = ((fpcr >> 8) & 0x70) | ((fpcr >> 4) & 0xf); - // const nbLit = (fpcr >> 7) & 0xf; - - // this.totalHWBreakpoints = nbCode; - - await this.setFpbEnabled(false); - - for (let i = 0; i < nbCode; i++) { - this.availableHWBreakpoints.push(CortexSpecialReg.FP_COMP0 + (4 * i)); - await this.core.memory.write32(CortexSpecialReg.FP_COMP0 + (i * 4), 0); - } - } - - /** - * Enable or disable the Flash Patch and Breakpoint unit (FPB). - * - * @param enabled - */ - private async setFpbEnabled(enabled = true) { - this.enabled = enabled; - await this.core.memory.write32(CortexSpecialReg.FP_CTRL, CortexSpecialReg.FP_CTRL_KEY | (enabled ? 1 : 0)); - } -} diff --git a/src/documentation.md b/src/documentation.md deleted file mode 100644 index ef894920..00000000 --- a/src/documentation.md +++ /dev/null @@ -1,50 +0,0 @@ -# JavaScript interface to on-chip debugger (CMSIS-DAP) - -## Prerequisites - -[Node.js > v8.9.0](https://nodejs.org), which includes `npm 5`. - -## Installation - -The SDK is distributed using npm. To install the package in your project: - -```bash -$ npm install dapjs -``` - -## Examples - -For more full-featured examples, please refer to the [examples](https://github.com/ARMmbed/dapjs/tree/master/examples) folder and see the web example running at: - -https://armmbed.github.io/dapjs/ - -```javascript -device = await navigator.usb.requestDevice({ - filters: [{vendorId: 0x0d28}] -}); - -this.deviceCode = device.serialNumber.slice(0, 4); -selector = new DAPjs.PlatformSelector(); -const info = await selector.lookupDevice(this.deviceCode); -this.hid = new DAPjs.HID(device); - -// open hid device -await this.hid.open(); -dapDevice = new DAPjs.DAP(this.hid); -// contains flash algorithms data and memory map -let flashAlgorithmsData = {}; -let flashAlgorithm = new DAPjs.FlashAlgorithm(flashAlgorithmsData, this.deviceCode); -this.target = new DAPjs.FlashTarget(dapDevice, flashAlgorithm); - -// init and halt target -await this.target.init(); -await this.target.halt(); - -// program_data contains binary data -program_data = DAPjs.FlashProgram.fromBinary(0, program_data); -await this.target.program(program_data, (progress) => { - console.log(progress); -}); - -await this.target.reset(); -``` diff --git a/src/index.ts b/src/index.ts index 6a260549..03f0f97f 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,10 +1,28 @@ -export {CortexM} from "./cortex/cortex"; -export {CortexReg, CortexSpecialReg, CoreState, CoreNames, ISANames} from "./cortex/constants"; -export {DAP} from "./dap/dap"; -export {Serial} from "./serial/serial"; +/* +* DAPjs +* Copyright Arm Limited 2018 +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in all +* copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +*/ -export {FlashTarget} from "./targets/FlashTarget"; -export {FlashProgram} from "./targets/FlashProgram"; -export {FlashAlgorithm} from "./targets/FlashAlgorithm"; -export {PlatformSelector} from "./targets/PlatformSelector"; -export {HID} from "./transport/hid"; +export { HID, USB, WebUSB } from "./transport"; +export { CmsisDAP } from "./proxy"; +export { DAPLink } from "./daplink"; +export { ADI } from "./dap"; +export { CortexM } from "./processor"; diff --git a/src/memory/memory.ts b/src/memory/memory.ts deleted file mode 100644 index 58ac2777..00000000 --- a/src/memory/memory.ts +++ /dev/null @@ -1,237 +0,0 @@ -import {DAP} from "../dap/dap"; - -import {ApReg, Csw, DapVal} from "../dap/constants"; -import {apReg, assert, bufferConcat, delay} from "../util"; - -import {PreparedMemoryCommand} from "./prepared"; - -/** - * # Memory Interface - * - * Controls access to the target's memory. - * - * ## Usage - * - * Using an instance of `CortexM`, as described before, we can simply read and - * write numbers to memory as follows: - * - * ```typescript - * const mem = core.memory; - * - * // NOTE: the address parameter must be word (4-byte) aligned. - * await mem.write32(0x200000, 12345); - * const val = await mem.read32(0x200000); - * - * // val === 12345 - * - * // NOTE: the address parameter must be half-word (2-byte) aligned - * await mem.write16(0x2000002, 65534); - * const val16 = await mem.read16(0x2000002); - * - * // val16 === 65534 - * ``` - * - * To write a larger block of memory, we can use `readBlock` and `writeBlock`. Again, - * these blocks must be written to word-aligned addresses in memory. - * - * ```typescript - * const data = new Uint32Array([0x1234, 0x5678, 0x9ABC, 0xDEF0]); - * await mem.writeBlock(0x200000, data); - * - * const readData = await mem.readBlock(0x200000, data.length, 0x100); - * ``` - * - * ## See also - * - * `PreparedMemoryCommand` provides an equivalent API with better performance (in some - * cases) by enabling batched memory operations. - */ -export class Memory { - private dev: DAP; - - constructor(dev: DAP) { - this.dev = dev; - } - - /** - * Write a 32-bit word to the specified (word-aligned) memory address. - * - * @param addr Memory address to write to - * @param data Data to write (values above 2**32 will be truncated) - */ - public async write32(addr: number, data: number) { - const prep = this.dev.prepareCommand(); - prep.writeAp(ApReg.CSW, Csw.CSW_VALUE | Csw.CSW_SIZE32); - prep.writeAp(ApReg.TAR, addr); - prep.writeAp(ApReg.DRW, data); - - await prep.go(); - } - - /** - * Write a 16-bit word to the specified (half word-aligned) memory address. - * - * @param addr Memory address to write to - * @param data Data to write (values above 2**16 will be truncated) - */ - public async write16(addr: number, data: number) { - data = data << ((addr & 0x02) << 3); - - const prep = this.dev.prepareCommand(); - prep.writeAp(ApReg.CSW, Csw.CSW_VALUE | Csw.CSW_SIZE16); - prep.writeAp(ApReg.TAR, addr); - prep.writeAp(ApReg.DRW, data); - - await prep.go(); - } - - /** - * Read a 32-bit word from the specified (word-aligned) memory address. - * - * @param addr Memory address to read from. - */ - public async read32(addr: number): Promise { - const prep = this.dev.prepareCommand(); - - prep.writeAp(ApReg.CSW, Csw.CSW_VALUE | Csw.CSW_SIZE32); - prep.writeAp(ApReg.TAR, addr); - prep.readAp(ApReg.DRW); - - try { - return (await prep.go())[0]; - } catch (e) { - // transfer wait, try again. - await delay(100); - return await this.read32(addr); - } - } - - /** - * Read a 16-bit word from the specified (half word-aligned) memory address. - * - * @param addr Memory address to read from. - */ - public async read16(addr: number): Promise { - const prep = this.dev.prepareCommand(); - - prep.writeAp(ApReg.CSW, Csw.CSW_VALUE | Csw.CSW_SIZE16); - prep.writeAp(ApReg.TAR, addr); - prep.readAp(ApReg.DRW); - - let val; - - try { - val = (await prep.go())[0]; - } catch (e) { - // transfer wait, try again. - await delay(100); - val = await this.read16(addr); - } - - val = (val >> ((addr & 0x02) << 3) & 0xffff); - return val; - } - - /** - * Reads a block of memory from the specified memory address. - * - * @param addr Address to read from - * @param words Number of words to read - * @param pageSize Memory page size - */ - public async readBlock(addr: number, words: number, pageSize: number) { - const funs = [async () => Promise.resolve()]; - const bufs: Uint8Array[] = []; - const end = addr + words * 4; - let ptr = addr; - - while (ptr < end) { - let nextptr = ptr + pageSize; - if (ptr === addr) { - nextptr &= ~(pageSize - 1); - } - - const len = Math.min(nextptr - ptr, end - ptr); - const ptr0 = ptr; - assert((len & 3) === 0); - funs.push(async () => { - bufs.push(await this.readBlockCore(ptr0, len >> 2)); - }); - - ptr = nextptr; - } - - for (const f of funs) { - await f(); - } - - const result = await bufferConcat(bufs); - return result.subarray(0, words * 4); - } - - /** - * Write a block of memory to the specified memory address. - * - * @param addr Memory address to write to. - * @param words Array of 32-bit words to write to memory. - */ - public async writeBlock(addr: number, words: Uint32Array) { - if (words.length === 0) { - return; - } - - return this.writeBlockCore(addr, words); - } - - public prepareCommand() { - return new PreparedMemoryCommand(this.dev); - } - - private async readBlockCore(addr: number, words: number) { - const prep = this.dev.prepareCommand(); - prep.writeAp(ApReg.CSW, Csw.CSW_VALUE | Csw.CSW_SIZE32); - prep.writeAp(ApReg.TAR, addr); - await prep.go(); - - let lastSize = words % 15; - if (lastSize === 0) { - lastSize = 15; - } - - const blocks: Uint8Array[] = []; - - for (let i = 0; i < Math.ceil(words / 15); i++) { - const b = await this.dev.readRegRepeat( - apReg(ApReg.DRW, DapVal.READ), - i === blocks.length - 1 ? lastSize : 15, - ); - blocks.push(b); - } - - return bufferConcat(blocks); - } - - private async writeBlockCore(addr: number, words: Uint32Array): Promise { - try { - const blSz = 14; - const reg = apReg(ApReg.DRW, DapVal.WRITE); - - const prep = this.dev.prepareCommand(); - prep.writeAp(ApReg.CSW, Csw.CSW_VALUE | Csw.CSW_SIZE32); - prep.writeAp(ApReg.TAR, addr); - - for (let i = 0; i < Math.ceil(words.length / blSz); i++) { - prep.writeRegRepeat(reg, words.subarray(i * blSz, i * blSz + blSz)); - } - - await prep.go(); - } catch (e) { - if (e.dapWait) { - await delay(100); - return await this.writeBlockCore(addr, words); - } else { - throw e; - } - } - } -} diff --git a/src/memory/prepared.ts b/src/memory/prepared.ts deleted file mode 100644 index 2457a77a..00000000 --- a/src/memory/prepared.ts +++ /dev/null @@ -1,98 +0,0 @@ -import {DAP} from "../dap/dap"; - -import {ApReg, Csw} from "../dap/constants"; -import {PreparedDapCommand} from "../dap/prepared"; - -/** - * # Prepared Memory Command - * - * Allows multiple memory operations to be batched together to improve HID - * interface utilisation. - * - * ## Usage - * - * Similarly to `CortexMPreparedCommand` and `DapPreparedCommand`, a convenience - * function exists to quickly create a prepared memory command: - * - * ```typescript - * const prep = core.memory.prepareCommand(); - * ``` - * - * You can then construct the sequence of commands using the same API as `Memory`. - * - * ```typescript - * prep.write32(0x20000, 1234); - * prep.write32(0x12344, 5678); - * prep.write16(0x12346, 123); - * ``` - * - * And then dispatch the prepared commands asynchronously: - * - * ```typescript - * await prep.go(); - * ``` - */ -export class PreparedMemoryCommand { - private cmd: PreparedDapCommand; - - constructor(dap: DAP) { - this.cmd = dap.prepareCommand(); - } - - /** - * Schedule a 32-bit memory write operation. - * - * @param addr Word-aligned memory address to write to. - * @param data Number to be written. - */ - public write32(addr: number, data: number) { - this.cmd.writeAp(ApReg.CSW, Csw.CSW_VALUE | Csw.CSW_SIZE32); - this.cmd.writeAp(ApReg.TAR, addr); - this.cmd.writeAp(ApReg.DRW, data); - } - - /** - * Schedule a 16-bit memory write operation. - * - * @param addr Half word-aligned memory address to write to. - * @param data Number to be written. - */ - public write16(addr: number, data: number) { - data = data << ((addr & 0x02) << 3); - - this.cmd.writeAp(ApReg.CSW, Csw.CSW_VALUE | Csw.CSW_SIZE16); - this.cmd.writeAp(ApReg.TAR, addr); - this.cmd.writeAp(ApReg.DRW, data); - } - - /** - * Schedule a 32-bit memory read operation. - * - * @param addr Word-aligned memory address to read from. - */ - public read32(addr: number) { - this.cmd.writeAp(ApReg.CSW, Csw.CSW_VALUE | Csw.CSW_SIZE32); - this.cmd.writeAp(ApReg.TAR, addr); - this.cmd.readAp(ApReg.DRW); - } - - /** - * Schedule a 16-bit memory read operation. - * - * FIXME: the values need to be shifted after being read. - * - * @param addr Half word-aligned memory address to read from. - */ - public read16(addr: number) { - this.cmd.writeAp(ApReg.CSW, Csw.CSW_VALUE | Csw.CSW_SIZE16); - this.cmd.writeAp(ApReg.TAR, addr); - this.cmd.readAp(ApReg.DRW); - } - - /** - * Execute all commands asynchronously. - */ - public async go() { - return this.cmd.go(); - } -} diff --git a/src/processor/cortex-m.ts b/src/processor/cortex-m.ts new file mode 100644 index 00000000..9669f9ad --- /dev/null +++ b/src/processor/cortex-m.ts @@ -0,0 +1,244 @@ +/* +* DAPjs +* Copyright Arm Limited 2018 +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in all +* copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +*/ + +import { ADI } from "../dap"; +import { + DebugRegister, + CoreRegister, + DhcsrMask, + DfsrMask, + DcrsrMask, + CoreState +} from "./enums"; +import { Processor } from "./"; +import { DAPOperation } from "../proxy"; + +/** + * @hidden + */ +const EXECUTE_TIMEOUT = 10000; +/** + * @hidden + */ +const BKPT_INSTRUCTION = 0xBE2A; +/** + * @hidden + */ +const GENERAL_REGISTER_COUNT = 12; + +/** + * Cortex M class + */ +export class CortexM extends ADI implements Processor { + + private enableDebug() { + return this.writeMem32(DebugRegister.DHCSR, DhcsrMask.DBGKEY | DhcsrMask.C_DEBUGEN); + } + + protected readCoreRegisterCommand(register: number): DAPOperation[] { + return this.writeMem32Command(DebugRegister.DCRSR, register) + .concat(this.readMem32Command(DebugRegister.DHCSR)) + .concat(this.readMem32Command(DebugRegister.DCRDR)); + } + + protected writeCoreRegisterCommand(register: number, value: number): DAPOperation[] { + return this.writeMem32Command(DebugRegister.DCRDR, value) + .concat(this.writeMem32Command(DebugRegister.DCRSR, register | DcrsrMask.REGWnR)); + } + + /** + * Get the state of the processor core + * @returns Promise of CoreState + */ + public getState(): Promise { + return this.readMem32(DebugRegister.DHCSR) + .then(dhcsr => { + let state: CoreState; + + if (dhcsr & DhcsrMask.S_LOCKUP) state = CoreState.LOCKUP; + else if (dhcsr & DhcsrMask.S_SLEEP) state = CoreState.SLEEPING; + else if (dhcsr & DhcsrMask.S_HALT) state = CoreState.DEBUG; + else state = CoreState.RUNNING; + + if (dhcsr & DhcsrMask.S_RESET_ST) { + // The core has been reset, check if an instruction has run + return this.readMem32(DebugRegister.DHCSR) + .then(newDhcsr => { + if (newDhcsr & DhcsrMask.S_RESET_ST && !(newDhcsr & DhcsrMask.S_RETIRE_ST)) { + return CoreState.RESET; + } else { + return state; + } + }); + } else { + return state; + } + }); + } + + /** + * Whether the target is halted + * @returns Promise of halted state + */ + public isHalted(): Promise { + return this.readMem32(DebugRegister.DHCSR) + .then(dhcsr => { + return !!(dhcsr & DhcsrMask.S_HALT); + }); + } + + /** + * Halt the target + * @param wait Wait until halted before returning + * @param timeout Milliseconds to wait before aborting wait + * @returns Promise + */ + public halt(wait: boolean = true, timeout: number = 0): Promise { + return this.isHalted() + .then(halted => { + if (halted) return; + + return this.writeMem32(DebugRegister.DHCSR, DhcsrMask.DBGKEY | DhcsrMask.C_DEBUGEN | DhcsrMask.C_HALT) + .then(() => { + if (!wait) return; + + return this.waitDelay(() => this.isHalted(), 100, timeout); + }); + }); + } + + /** + * Resume a target + * @param wait Wait until resumed before returning + * @param timeout Milliseconds to wait before aborting wait + * @returns Promise + */ + public resume(wait: boolean = true, timeout: number = 0) { + return this.isHalted() + .then(halted => { + if (!halted) return; + + return this.writeMem32(DebugRegister.DFSR, DfsrMask.DWTTRAP | DfsrMask.BKPT | DfsrMask.HALTED) + .then(() => this.enableDebug()) + .then(() => { + if (!wait) return; + + return this.waitDelay(() => this.isHalted().then(result => !result), 100, timeout); + }); + }); + } + + /** + * Read from a core register + * @param register The register to read + * @returns Promise of value + */ + public readCoreRegister(register: CoreRegister): Promise { + return this.transferSequence([ + this.writeMem32Command(DebugRegister.DCRSR, register), + this.readMem32Command(DebugRegister.DHCSR) + ]) + .then(results => { + const dhcsr = results[0]; + if (!(dhcsr & DhcsrMask.S_REGRDY)) { + throw new Error("Register not ready"); + } + + return this.readMem32(DebugRegister.DCRDR); + }); + } + + /** + * Read an array of core registers + * @param registers The registers to read + * @returns Promise of register values in an array + */ + public readCoreRegisters(registers: CoreRegister[]): Promise { + let chain = Promise.resolve([]); + + registers.forEach(register => { + chain = chain.then(results => this.readCoreRegister(register).then(result => [...results, result])); + }); + + return chain; + } + + /** + * Write to a core register + * @param register The register to write to + * @param value The value to write + * @returns Promise + */ + public writeCoreRegister(register: CoreRegister, value: number): Promise { + return this.transferSequence([ + this.writeMem32Command(DebugRegister.DCRDR, value), + this.writeMem32Command(DebugRegister.DCRSR, register | DcrsrMask.REGWnR), + this.readMem32Command(DebugRegister.DHCSR) + ]) + .then(results => { + const dhcsr = results[0]; + if (!(dhcsr & DhcsrMask.S_REGRDY)) { + throw new Error("Register not ready"); + } + }); + } + + /** + * Exucute code at a specified memory address + * @param address The address to put the code + * @param code The code to use + * @param stackPointer The stack pointer to use + * @param programCounter The program counter to use + * @param linkRegister The link register to use (defaults to address + 1) + * @param registers Values to add to the general purpose registers, R0, R1, R2, etc. + */ + public execute(address: number, code: Uint32Array, stackPointer: number, programCounter: number, linkRegister: number = address + 1, ...registers: number[]): Promise { + + // Ensure a breakpoint exists at the end of the code + if (code[code.length - 1] !== BKPT_INSTRUCTION) { + const newCode = new Uint32Array(code.length + 1); + newCode.set(code); + newCode.set([BKPT_INSTRUCTION], code.length - 1); + code = newCode; + } + + // Create sequence of core register writes + const sequence = [ + this.writeCoreRegisterCommand(CoreRegister.SP, stackPointer), + this.writeCoreRegisterCommand(CoreRegister.PC, programCounter), + this.writeCoreRegisterCommand(CoreRegister.LR, linkRegister) + ]; + + // Add in register values R0, R1, R2, etc. + for (let i = 0; i < Math.min(registers.length, GENERAL_REGISTER_COUNT); i++) { + sequence.push(this.writeCoreRegisterCommand(i, registers[i])); + } + + return this.halt() // Halt the target + .then(() => this.transferSequence(sequence)) // Write the registers + .then(() => this.writeBlock(address, code)) // Write the code to the address + .then(() => this.resume(false)) // Resume the target, without waiting + .then(() => this.waitDelay(() => this.isHalted(), 100, EXECUTE_TIMEOUT)) // Wait for the target to halt on the breakpoint + .then(() => undefined); // Return + } +} diff --git a/src/processor/enums.ts b/src/processor/enums.ts new file mode 100644 index 00000000..0406290a --- /dev/null +++ b/src/processor/enums.ts @@ -0,0 +1,330 @@ +/* +* DAPjs +* Copyright Arm Limited 2018 +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in all +* copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +*/ + +/** + * Processor Core States + */ +export const enum CoreState { + /** + * The core has been reset + */ + RESET, + /** + * Core is running with a lockup condition + */ + LOCKUP, + /** + * The core is sleeping + */ + SLEEPING, + /** + * The core is in debug state + */ + DEBUG, + /** + * The core is running + */ + RUNNING +} + +/** + * Processor Core Registers + * http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.100230_0004_00_en/way1435345987733.html + */ +export const enum CoreRegister { + /** + * General purpose register + */ + R0 = 0, + /** + * General purpose register + */ + R1 = 1, + /** + * General purpose register + */ + R2 = 2, + /** + * General purpose register + */ + R3 = 3, + /** + * General purpose register + */ + R4 = 4, + /** + * General purpose register + */ + R5 = 5, + /** + * General purpose register + */ + R6 = 6, + /** + * General purpose register + */ + R7 = 7, + /** + * General purpose register + */ + R8 = 8, + /** + * General purpose register + */ + R9 = 9, + /** + * General purpose register + */ + R10 = 10, + /** + * General purpose register + */ + R11 = 11, + /** + * General purpose register + */ + R12 = 12, + /** + * Stack Pointer + */ + SP = 13, + /** + * The Link Register + */ + LR = 14, + /** + * The Program Counter + */ + PC = 15, + /** + * The Program Status Register + */ + PSR = 16, + /** + * Main Stack Pointer + */ + MSP = 17, + /** + * Process Stack Pointer + */ + PSP = 18, + /** + * Prevents activation of exceptions + */ + PRIMASK = 20, + /** + * Controls the stack used + */ + CONTROL = 20 +} + +/** + * Debug Registers + * http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.100165_0201_00_en/ric1417175947147.html + */ +export const enum DebugRegister { + /** + * Debug Fault Status Register + */ + DFSR = 0xE000ED30, + /** + * Debug Halting Control and Status Register + */ + DHCSR = 0xE000EDF0, + /** + * Debug Core Register Selector Register, write only + */ + DCRSR = 0xE000EDF4, + /** + * Debug Core Register Data Register + */ + DCRDR = 0xE000EDF8, + /** + * Debug Exception and Monitor Control Register + */ + DEMCR = 0xE000EDFC +} + +/** + * Debug Halting Control and Status Register + * http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0337e/CEGCJAHJ.html + * @hidden + */ +export const enum DhcsrMask { + /** + * Enables debug + */ + C_DEBUGEN = (1 << 0), + /** + * Halts the core + */ + C_HALT = (1 << 1), + /** + * Steps the core in halted debug + */ + C_STEP = (1 << 2), + /** + * Mask interrupts when stepping or running in halted debug + */ + C_MASKINTS = (1 << 3), + /** + * Enables Halting debug to gain control + */ + C_SNAPSTALL = (1 << 5), + /** + * Register Read/Write on the Debug Core Register Selector register is available + */ + S_REGRDY = (1 << 16), + /** + * The core is in debug state + */ + S_HALT = (1 << 17), + /** + * Indicates that the core is sleeping + */ + S_SLEEP = (1 << 18), + /** + * Core is running (not halted) and a lockup condition is present + */ + S_LOCKUP = (1 << 19), + /** + * An instruction has completed since last read + */ + S_RETIRE_ST = (1 << 24), + /** + * The core has been reset + */ + S_RESET_ST = (1 << 25), + /** + * Debug Key + */ + DBGKEY = (0xA05F << 16) +} + +/** + * Debug Fault Status Register Mask + * http://infocenter.arm.com/help/topic/com.arm.doc.ddi0413d/Cihdifbf.html + * @hidden + */ +export const enum DfsrMask { + /** + * Halt request flag + */ + HALTED = (1 << 0), + /** + * BKPT instruction or hardware breakpoint match + */ + BKPT = (1 << 1), + /** + * Data Watchpoint (DW) flag + */ + DWTTRAP = (1 << 2), + /** + * Vector catch occurred + */ + VCATCH = (1 << 3), + /** + * External debug request (EDBGRQ) has halted the core + */ + EXTERNAL = (1 << 4) +} + +/** + * Debug Core Register Selector Register Mask + * http://infocenter.arm.com/help/topic/com.arm.doc.ddi0337e/CEGIAJBH.html + * @hidden + */ +export const enum DcrsrMask { + /** + * Register write or read, write is 1 + */ + REGWnR = (1 << 16), + /** + * Register select - DebugReturnAddress & PSR/Flags, Execution Number, and state information + */ + REGSEL = 0x1F, +} + +/** + * Flash Patch and Breakpoint Registers + * http://infocenter.arm.com/help/topic/com.arm.doc.100165_0201_00_en/ric1417175949176.html + * @hidden + */ +export const enum FPBRegister { + /** + * FlashPatch Control Register + */ + FP_CTRL = 0xE0002000, + /** + * FlashPatch Remap Register + */ + FP_REMAP = 0xE0002004, + /** + * FlashPatch Comparator Register0 + */ + FP_COMP0 = 0xE0002008, + /** + * FlashPatch Comparator Register1 + */ + FP_COMP1 = 0xE000200C, + /** + * FlashPatch Comparator Register2 + */ + FP_COMP2 = 0xE0002010, + /** + * FlashPatch Comparator Register3 + */ + FP_COMP3 = 0xE0002014, + /** + * FlashPatch Comparator Register4 + */ + FP_COMP4 = 0xE0002018, + /** + * FlashPatch Comparator Register5 + */ + FP_COMP5 = 0xE000201C, + /** + * FlashPatch Comparator Register6 + */ + FP_COMP6 = 0xE0002020, + /** + * FlashPatch Comparator Register7 + */ + FP_COMP7 = 0xE0002024, +} + +/** + * Flash Patch and Breakpoint Control Register Mask + * http://infocenter.arm.com/help/topic/com.arm.doc.ddi0337e/ch11s04s01.html#BABCAFAG + * @hidden + */ +export enum FPBCtrlMask { + /** + * Flash patch unit enable + */ + ENABLE = (1 << 0), + /** + * Key field which enables writing to the Flash Patch Control Register + */ + KEY = (1 << 1) +} diff --git a/src/processor/index.ts b/src/processor/index.ts new file mode 100644 index 00000000..efd16360 --- /dev/null +++ b/src/processor/index.ts @@ -0,0 +1,93 @@ +/* +* DAPjs +* Copyright Arm Limited 2018 +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in all +* copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +*/ + +import { DAP } from "../dap"; +import { CoreRegister, CoreState } from "./enums"; + +/** + * Processor interface + */ +export interface Processor extends DAP { + /** + * Get the state of the processor core + * @returns Promise of CoreState + */ + getState(): Promise; + + /** + * Whether the target is halted + * @returns Promise of halted state + */ + isHalted(): Promise; + + /** + * Halt the target + * @param wait Wait until halted before returning + * @param timeout Milliseconds to wait before aborting wait + * @returns Promise + */ + halt(wait?: boolean, timeout?: number): Promise; + + /** + * Resume a target + * @param wait Wait until resumed before returning + * @param timeout Milliseconds to wait before aborting wait + * @returns Promise + */ + resume(wait?: boolean, timeout?: number): Promise; + + /** + * Read from a core register + * @param register The register to read + * @returns Promise of value + */ + readCoreRegister(register: CoreRegister): Promise; + + /** + * Read an array of core registers + * @param registers The registers to read + * @returns Promise of register values in an array + */ + readCoreRegisters(registers: CoreRegister[]): Promise; + + /** + * Write to a core register + * @param register The register to write to + * @param value The value to write + * @returns Promise + */ + writeCoreRegister(register: CoreRegister, value: number): Promise; + + /** + * Exucute code at a specified memory address + * @param address The address to put the code + * @param code The code to use + * @param stackPointer The stack pointer to use + * @param programCounter The program counter to use + * @param linkRegister The link register to use (defaults to address + 1) + * @param registers Values to add to the general purpose registers, R0, R1, R2, etc. + */ + execute(address: number, code: Uint32Array, stackPointer: number, programCounter: number, linkRegister?: number, ...registers: number[]): Promise; +} + +export { CortexM } from "./cortex-m"; diff --git a/src/proxy/cmsis-dap.ts b/src/proxy/cmsis-dap.ts new file mode 100644 index 00000000..406db31d --- /dev/null +++ b/src/proxy/cmsis-dap.ts @@ -0,0 +1,446 @@ +/* +* DAPjs +* Copyright Arm Limited 2018 +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in all +* copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +*/ + +import { EventEmitter } from "events"; +import { Transport } from "../transport"; +import { + DAPPort, + DAPTransferMode, + DAPProtocol, + DAPCommand, + DAPConnectResponse, + DAPResponse, + DAPInfoRequest, + DAPResetTargeResponse, + DAPTransferResponse +} from "./enums"; +import { Proxy, DAPOperation } from "./"; + +/** + * @hidden + */ +export const DEFAULT_CLOCK_FREQUENCY = 10000000; +/** + * @hidden + */ +const SWD_SEQUENCE = 0xE79E; +/** + * @hidden + */ +const JTAG_SEQUENCE = 0xE73C; + +/** + * @hidden + */ +const BLOCK_HEADER_SIZE = 4; +/** + * @hidden + */ +const TRANSFER_HEADER_SIZE = 2; +/** + * @hidden + */ +const TRANSFER_OPERATION_SIZE = 5; + +/** + * CMSIS-DAP class + * https://www.keil.com/pack/doc/CMSIS/DAP/html/group__DAP__Commands__gr.html + */ +export class CmsisDAP extends EventEmitter implements Proxy { + + /** + * The maximum DAPOperations which can be transferred + */ + public operationCount: number; + + /** + * The maximum block size which can be transferred + */ + public blockSize: number; + + /** + * CMSIS-DAP constructor + * @param transport Debug transport to use + * @param mode Debug mode to use + * @param clockFrequency Communication clock frequency to use (default 10000000) + */ + constructor(private transport: Transport, private mode: DAPProtocol = DAPProtocol.DEFAULT, private clockFrequency: number = DEFAULT_CLOCK_FREQUENCY) { + super(); + + // Determine the block size + this.blockSize = this.transport.packetSize - BLOCK_HEADER_SIZE - 1; // -1 for the DAP_TRANSFER_BLOCK command + + // Determine the operation count possible + const operationSpace = this.transport.packetSize - TRANSFER_HEADER_SIZE - 1; // -1 for the DAP_TRANSFER command + this.operationCount = Math.floor(operationSpace / TRANSFER_OPERATION_SIZE); + } + + private delay(timeout: number): Promise { + return new Promise((resolve, _reject) => { + setTimeout(resolve, timeout); + }); + } + + private bufferSourceToUint8Array(prefix: number, data?: BufferSource): Uint8Array { + + if (!data) { + return new Uint8Array([prefix]); + } + + function isView(source: ArrayBuffer | ArrayBufferView): source is ArrayBufferView { + return (source as ArrayBufferView).buffer !== undefined; + } + + const arrayBuffer = isView(data) ? data.buffer : data; + const result = new Uint8Array(arrayBuffer.byteLength + 1); + + result.set([prefix]); + result.set(new Uint8Array(arrayBuffer), 1); + + return result; + } + + /** + * Switches the CMSIS-DAP unit to use SWD + * http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0316d/Chdhfbhc.html + */ + protected selectProtocol(protocol: DAPProtocol): Promise { + const sequence = protocol === DAPProtocol.JTAG ? JTAG_SEQUENCE : SWD_SEQUENCE; + + return this.swjSequence(new Uint8Array([0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF])) // Sequence of 1's + .then(() => this.swjSequence(new Uint16Array([sequence]))) // Send protocol sequence + .then(() => this.swjSequence(new Uint8Array([0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]))) // Sequence of 1's + .then(() => this.swjSequence(new Uint8Array([0x00]))); + } + + /** + * Send an SWJ Sequence + * https://www.keil.com/pack/doc/CMSIS/DAP/html/group__DAP__SWJ__Sequence.html + * @param sequence The sequence to send + * @returns Promise + */ + protected swjSequence(sequence: BufferSource): Promise { + const bitLength = sequence.byteLength * 8; + const data = this.bufferSourceToUint8Array(bitLength, sequence); + + return this.send(DAPCommand.DAP_SWJ_SEQUENCE, data) + .then(() => undefined); + } + + /** + * Configure Transfer + * https://www.keil.com/pack/doc/CMSIS/DAP/html/group__DAP__TransferConfigure.html + * @param idleCycles Number of extra idle cycles after each transfer + * @param waitRetry Number of transfer retries after WAIT response + * @param matchRetry Number of retries on reads with Value Match in DAP_Transfer + * @returns Promise + */ + protected configureTransfer(idleCycles: number, waitRetry: number, matchRetry: number): Promise { + const data = new Uint8Array(5); + const view = new DataView(data.buffer); + + view.setUint8(0, idleCycles); + view.setUint16(1, waitRetry, true); + view.setUint16(3, matchRetry, true); + + return this.send(DAPCommand.DAP_TRANSFER_CONFIGURE, data) + .then(() => undefined); + } + + /** + * Send a command + * @param command Command to send + * @param data Data to use + * @returns Promise of DataView + */ + protected send(command: number, data?: BufferSource): Promise { + const array = this.bufferSourceToUint8Array(command, data); + + return this.transport.write(array) + .then(() => this.transport.read()) + .then(response => { + if (response.getUint8(0) !== command) { + throw new Error(`Bad response for ${command} -> ${response.getUint8(0)}`); + } + + switch (command) { + case DAPCommand.DAP_DISCONNECT: + case DAPCommand.DAP_WRITE_ABORT: + case DAPCommand.DAP_DELAY: + case DAPCommand.DAP_RESET_TARGET: + case DAPCommand.DAP_SWJ_CLOCK: + case DAPCommand.DAP_SWJ_SEQUENCE: + case DAPCommand.DAP_SWD_CONFIGURE: + case DAPCommand.DAP_SWD_SEQUENCE: + case DAPCommand.DAP_SWO_TRANSPORT: + case DAPCommand.DAP_SWO_MODE: + case DAPCommand.DAP_SWO_CONTROL: + case DAPCommand.DAP_JTAG_CONFIGURE: + case DAPCommand.DAP_JTAG_ID_CODE: + case DAPCommand.DAP_TRANSFER_CONFIGURE: + if (response.getUint8(1) !== DAPResponse.DAP_OK) { + throw new Error(`Bad status for ${command} -> ${response.getUint8(1)}`); + } + } + + return response; + }); + } + + /** + * Connect to target device + * @returns Promise + */ + public connect(): Promise { + return this.transport.open() + .then(() => this.send(DAPCommand.DAP_SWJ_CLOCK, new Uint32Array([this.clockFrequency]))) + .then(() => this.send(DAPCommand.DAP_CONNECT, new Uint8Array([this.mode]))) + .then(result => { + if (result.getUint8(1) === DAPConnectResponse.FAILED || this.mode !== DAPProtocol.DEFAULT && result.getUint8(1) !== this.mode) { + throw new Error("Mode not enabled."); + } + }) + .then(() => this.configureTransfer(0, 100, 0)) + .then(() => this.selectProtocol(DAPProtocol.SWD)); + } + + /** + * Disconnect from target device + * @returns Promise + */ + public disconnect(): Promise { + return this.send(DAPCommand.DAP_DISCONNECT) + .then(() => { + return this.transport.close(); + }); + } + + /** + * Reconnect to target device + * @returns Promise + */ + public reconnect(): Promise { + return this.disconnect() + .then(() => this.delay(100)) + .then(() => this.connect()); + } + + /** + * Reset target device + * @returns Promise of whether a device specific reset sequence is implemented + */ + public reset(): Promise { + return this.send(DAPCommand.DAP_RESET_TARGET) + .then(response => response.getUint8(2) === DAPResetTargeResponse.RESET_SEQUENCE); + } + + /** + * Get DAP information + * @param request Type of information to get + * @returns Promise of DataView + */ + public dapInfo(request: DAPInfoRequest): Promise { + return this.send(DAPCommand.DAP_INFO, new Uint8Array([request])) + .then(result => { + const length = result.getUint8(1); + + if (length === 0) { + return null; + } + + switch (request) { + case DAPInfoRequest.CAPABILITIES: + case DAPInfoRequest.PACKET_COUNT: + case DAPInfoRequest.PACKET_SIZE: + case DAPInfoRequest.SWO_TRACE_BUFFER_SIZE: + // Byte + if (length === 1) return result.getUint8(2); + + // Short + if (length === 2) return result.getUint16(2); + + // Word + if (length === 4) return result.getUint32(2); + } + + const ascii = new Uint8Array(result.buffer, 2, length); + return String.fromCharCode.apply(null, ascii); + }); + } + + /** + * Transfer data with a single read or write operation + * @param port Port type (debug port or access port) + * @param mode Whether to read or write + * @param register The register to use + * @param value Any value to write + * @returns Promise of any value read + */ + public transfer(port: DAPPort, mode: DAPTransferMode, register: number, value?: number): Promise; + /** + * Transfer data with multiple read or write operations + * @param operations The operations to use + * @returns Promise of any values read + */ + public transfer(operations: DAPOperation[]): Promise; + public transfer(portOrOps: DAPPort | DAPOperation[], mode?: DAPTransferMode, register?: number, value?: number): Promise { + + let operations: DAPOperation[]; + + if (typeof portOrOps === "number") { + operations = [{ + port: portOrOps, + mode, + register, + value + }]; + } else { + operations = portOrOps; + } + + const data = new Uint8Array(TRANSFER_HEADER_SIZE + (operations.length * TRANSFER_OPERATION_SIZE)); + const view = new DataView(data.buffer); + + // DAP Index, ignored for SWD + view.setUint8(0, 0); + // Transfer count + view.setUint8(1, operations.length); + + operations.forEach((operation, index) => { + const offset = TRANSFER_HEADER_SIZE + (index * TRANSFER_OPERATION_SIZE); + + // Transfer request + view.setUint8(offset, operation.port | operation.mode | operation.register); + // Transfer data + view.setUint32(offset + 1, operation.value, true); + }); + + return this.send(DAPCommand.DAP_TRANSFER, data) + .then(result => { + + // Transfer count + if (result.getUint8(1) !== operations.length) { + throw new Error("Transfer count mismatch"); + } + + // Transfer response + const response = result.getUint8(2); + if (response === DAPTransferResponse.WAIT) { + throw new Error("Transfer response WAIT"); + } + if (response === DAPTransferResponse.FAULT) { + throw new Error("Transfer response FAULT"); + } + if (response === DAPTransferResponse.PROTOCOL_ERROR) { + throw new Error("Transfer response PROTOCOL_ERROR"); + } + if (response === DAPTransferResponse.VALUE_MISMATCH) { + throw new Error("Transfer response VALUE_MISMATCH"); + } + if (response === DAPTransferResponse.NO_ACK) { + throw new Error("Transfer response NO_ACK"); + } + + if (typeof portOrOps === "number") { + return result.getUint32(3, true); + } else { + const length = operations.length * 4; + return new Uint32Array(result.buffer.slice(3, 3 + length)); + } + }); + } + + /** + * Read a block of data from a single register + * @param port Port type (debug port or access port) + * @param register The register to use + * @returns Promise of values read + */ + public transferBlock(port: DAPPort, register: number, count: number): Promise; + /** + * Write a block of data to a single register + * @param port Port type (debug port or access port) + * @param register The register to use + * @param values The values to write + * @returns Promise + */ + public transferBlock(port: DAPPort, register: number, values: Uint32Array): Promise; + public transferBlock(port: DAPPort, register: number, countOrValues: number | Uint32Array): Promise { + + let operationCount: number; + let mode: DAPTransferMode; + let dataSize = BLOCK_HEADER_SIZE; + + if (typeof countOrValues === "number") { + operationCount = countOrValues; + mode = DAPTransferMode.READ; + } else { + operationCount = countOrValues.length; + mode = DAPTransferMode.WRITE; + dataSize += countOrValues.byteLength; + } + + const data = new Uint8Array(dataSize); + const view = new DataView(data.buffer); + + // DAP Index, ignored for SWD + view.setUint8(0, 0); + // Transfer count + view.setUint16(1, operationCount, true); + // Transfer request + view.setUint8(3, port | mode | register); + + if (typeof countOrValues !== "number") { + // Transfer data + data.set(countOrValues, BLOCK_HEADER_SIZE); + } + + return this.send(DAPCommand.DAP_TRANSFER_BLOCK, view) + .then(result => { + + // Transfer count + if (result.getUint16(1, true) !== operationCount) { + throw new Error("Transfer count mismatch"); + } + + // Transfer response + const response = result.getUint8(3); + if (response & DAPTransferResponse.WAIT) { + throw new Error("Transfer response WAIT"); + } + if (response & DAPTransferResponse.FAULT) { + throw new Error("Transfer response FAULT"); + } + if (response & DAPTransferResponse.PROTOCOL_ERROR) { + throw new Error("Transfer response PROTOCOL_ERROR"); + } + if (response & DAPTransferResponse.NO_ACK) { + throw new Error("Transfer response NO_ACK"); + } + + if (typeof countOrValues === "number") { + return new Uint32Array(result.buffer.slice(4)); + } + }); + } +} diff --git a/src/proxy/enums.ts b/src/proxy/enums.ts new file mode 100644 index 00000000..406f5a30 --- /dev/null +++ b/src/proxy/enums.ts @@ -0,0 +1,410 @@ +/* +* DAPjs +* Copyright Arm Limited 2018 +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in all +* copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +*/ + +/** + * CMSIS-DAP Protocol + * https://www.keil.com/pack/doc/CMSIS/DAP/html/group__DAP__Connect.html + */ +export const enum DAPProtocol { + /** + * Default mode: configuration of the DAP port mode is derived from DAP_DEFAULT_PORT + */ + DEFAULT = 0, + /** + * SWD mode: connect with Serial Wire Debug mode + */ + SWD = 1, + /** + * JTAG mode: connect with 4/5-pin JTAG mode + */ + JTAG = 2 +} + +/** + * DAP Ports + */ +export const enum DAPPort { + /** + * Debug Port (DP) + */ + DEBUG = 0x00, + /** + * Access Port (AP) + */ + ACCESS = 0x01 +} + +/** + * DAP Register Transfer Modes + */ +export const enum DAPTransferMode { + /** + * Write + */ + WRITE = 0x00, + /** + * Read + */ + READ = 0x02 +} + +/** + * CMSIS-DAP Commands + * https://www.keil.com/pack/doc/CMSIS/DAP/html/group__DAP__genCommands__gr.html + */ +export const enum DAPCommand { + /** + * Get Information about CMSIS-DAP Debug Unit + */ + DAP_INFO = 0x00, + /** + * Sent status information of the debugger to Debug Unit + */ + DAP_HOST_STATUS = 0x01, + /** + * Connect to Device and selected DAP mode + */ + DAP_CONNECT = 0x02, + /** + * Disconnect from active Debug Port + */ + DAP_DISCONNECT = 0x03, + /** + * Configure Transfers + */ + DAP_TRANSFER_CONFIGURE = 0x04, + /** + * Read/write single and multiple registers + */ + DAP_TRANSFER = 0x05, + /** + * Read/Write a block of data from/to a single register + */ + DAP_TRANSFER_BLOCK = 0x06, + /** + * Abort current Transfer + */ + DAP_TRANSFER_ABORT = 0x07, + /** + * Write ABORT Register + */ + DAP_WRITE_ABORT = 0x08, + /** + * Wait for specified delay + */ + DAP_DELAY = 0x09, + /** + * Reset Target with Device specific sequence + */ + DAP_RESET_TARGET = 0x0A, + /** + * Control and monitor SWD/JTAG Pins + */ + DAP_SWJ_PINS = 0x10, + /** + * Select SWD/JTAG Clock + */ + DAP_SWJ_CLOCK = 0x11, + /** + * Generate SWJ sequence SWDIO/TMS @SWCLK/TCK + */ + DAP_SWJ_SEQUENCE = 0x12, + /** + * Configure SWD Protocol + */ + DAP_SWD_CONFIGURE = 0x13, + /** + * Generate JTAG sequence TMS, TDI and capture TDO + */ + DAP_JTAG_SEQUENCE = 0x14, + /** + * Configure JTAG Chain + */ + DAP_JTAG_CONFIGURE = 0x15, + /** + * Read JTAG IDCODE + */ + DAP_JTAG_ID_CODE = 0x16, + /** + * Set SWO transport mode + */ + DAP_SWO_TRANSPORT = 0x17, + /** + * Set SWO capture mode + */ + DAP_SWO_MODE = 0x18, + /** + * Set SWO baudrate + */ + DAP_SWO_BAUD_RATE = 0x19, + /** + * Control SWO trace data capture + */ + DAP_SWO_CONTROL = 0x1A, + /** + * Read SWO trace status + */ + DAP_SWO_STATUS = 0x1B, + /** + * Read SWO trace data + */ + DAP_SWO_DATA = 0x1C, + /** + * Generate SWD sequence and output on SWDIO or capture input from SWDIO data + */ + DAP_SWD_SEQUENCE = 0x1D, + /** + * Read SWO trace extended status + */ + DAP_SWO_EXTENDED_STATUS = 0x1E, + /** + * Execute multiple DAP commands from a single packet + */ + DAP_EXECUTE_COMMANDS = 0x7F, + /** + * Queue multiple DAP commands provided in a multiple packets + */ + DAP_QUEUE_COMMANDS = 0x7E +} + +/** + * CMSIS-DAP Command Response + * @hidden + */ +export const enum DAPResponse { + /** + * This is fine + */ + DAP_OK = 0x00, + /** + * Error + */ + DAP_ERROR = 0xFF +} + +/** + * Get Information about CMSIS-DAP Debug Unit + * https://www.keil.com/pack/doc/CMSIS/DAP/html/group__DAP__Info.html + */ +export const enum DAPInfoRequest { + /** + * Get the Vendor ID (string) + */ + VENDOR_ID = 0x01, + /** + * Get the Product ID (string) + */ + PRODUCT_ID = 0x02, + /** + * Get the Serial Number (string) + */ + SERIAL_NUMBER = 0x03, + /** + * Get the CMSIS-DAP Firmware Version (string) + */ + CMSIS_DAP_FW_VERSION = 0x04, + /** + * Get the Target Device Vendor (string) + */ + TARGET_DEVICE_VENDOR = 0x05, + /** + * Get the Target Device Name (string) + */ + TARGET_DEVICE_NAME = 0x06, + /** + * Get information about the Capabilities (BYTE) of the Debug Unit + */ + CAPABILITIES = 0xF0, + /** + * Get the Test Domain Timer parameter information + */ + TEST_DOMAIN_TIMER = 0xF1, + /** + * Get the SWO Trace Buffer Size (WORD) + */ + SWO_TRACE_BUFFER_SIZE = 0xFD, + /** + * Get the maximum Packet Count (BYTE) + */ + PACKET_COUNT = 0xFE, + /** + * Get the maximum Packet Size (SHORT) + */ + PACKET_SIZE = 0xFF, +} + +/** + * CMSIS-DAP Host Status Type + * https://www.keil.com/pack/doc/CMSIS/DAP/html/group__DAP__HostStatus.html + * @hidden + */ +export const enum DAPHostStatusType { + /** + * Connect: Status indicates that the debugger is connected to the Debug Unit + */ + CONNECT = 0, + /** + * Running: Status indicates that the target hardware is executing application code + */ + RUNNING = 1 +} + +/** + * CMSIS-DAP Host Status Response + * https://www.keil.com/pack/doc/CMSIS/DAP/html/group__DAP__HostStatus.html + * @hidden + */ +export const enum DAPHostStatusResponse { + /** + * False: may be used to turn off a status LED (Connect or Running) on the Debug Unit + */ + FALSE = 0, + /** + * True: may be used to turn on a status LED (Connect or Running) on the Debug Unit + */ + TRUE = 1 +} + +/** + * CMSIS-DAP Connect Response + * https://www.keil.com/pack/doc/CMSIS/DAP/html/group__DAP__Connect.html + * @hidden + */ +export const enum DAPConnectResponse { + /** + * Initialization failed; no mode pre-configured + */ + FAILED = 0, + /** + * Initialization for SWD mode + */ + SWD = 1, + /** + * Initialization for JTAG mode + */ + JTAG = 2 +} + +/** + * CMSIS-DAP Reset Target Execute Response + * https://www.keil.com/pack/doc/CMSIS/DAP/html/group__DAP__ResetTarget.html + * @hidden + */ +export const enum DAPResetTargeResponse { + /** + * No device specific reset sequence is implemented + */ + NO_RESET_SEQUENCE = 0, + /** + * A device specific reset sequence is implemented + */ + RESET_SEQUENCE = 1 +} + +/** + * CMSIS-DAP SWO Transport + * https://www.keil.com/pack/doc/CMSIS/DAP/html/group__DAP__SWO__Transport.html + * @hidden + */ +export const enum DAPSWOTransport { + /** + * None (default) + */ + NONE = 0, + /** + * Read trace data via DAP_SWO_Data command + */ + READ = 1, + /** + * Send trace data via separate WinUSB endpoint (requires CMSIS-DAP v2 configuration) + */ + SEND = 2 +} + +/** + * CMSIS-DAP SWO Mode + * https://www.keil.com/pack/doc/CMSIS/DAP/html/group__DAP__SWO__Mode.html + * @hidden + */ +export const enum DAPSWOMode { + /** + * Off (default) + */ + OFF = 0, + /** + * UART + */ + UART = 1, + /** + * Manchester + */ + MANCHESTER = 2 +} + +/** + * CMSIS-DAP SWO Control + * https://www.keil.com/pack/doc/CMSIS/DAP/html/group__DAP__SWO__Control.html + * @hidden + */ +export const enum DAPSWOControl { + /** + * Stop + */ + STOP = 0, + /** + * Start + */ + START = 1 +} + +/** + * CMSIS-DAP Transfer Response + * https://www.keil.com/pack/doc/CMSIS/DAP/html/group__DAP__Transfer.html + * @hidden + */ +export const enum DAPTransferResponse { + /** + * OK (for SWD protocol), OK or FAULT (for JTAG protocol) + */ + OK = 0x01, + /** + * Wait + */ + WAIT = 0x02, + /** + * Fault + */ + FAULT = 0x04, + /** + * NO_ACK (no response from target) + */ + NO_ACK = 0x07, + /** + * Protocol Error (SWD) + */ + PROTOCOL_ERROR = 0x08, + /** + * Value Mismatch (Read Register with Value Match) + */ + VALUE_MISMATCH = 0x10 +} diff --git a/src/proxy/index.ts b/src/proxy/index.ts new file mode 100644 index 00000000..999f1a8e --- /dev/null +++ b/src/proxy/index.ts @@ -0,0 +1,121 @@ +/* +* DAPjs +* Copyright Arm Limited 2018 +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in all +* copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +*/ + +import { DAPPort, DAPTransferMode } from "./enums"; + +/** + * CMSIS-DAP Transfer Operation + */ +export interface DAPOperation { + /** + * The register to use + */ + register: number; + /** + * The read/write mode to use + */ + mode: DAPTransferMode; + /** + * The port to use (Debug/Access) + */ + port: DAPPort; + /** + * The (optional) value to write + */ + value?: number; +} + +/** + * CMSIS Proxy interface + */ +export interface Proxy { + /** + * The maximum DAPOperations which can be transferred + */ + operationCount: number; + + /** + * The maximum block size which can be transferred + */ + blockSize: number; + + /** + * Connect to target device + * @returns Promise + */ + connect(): Promise; + + /** + * Disconnect from target device + * @returns Promise + */ + disconnect(): Promise; + + /** + * Reconnect to target device + * @returns Promise + */ + reconnect(): Promise; + + /** + * Reset target device + * @returns Promise + */ + reset(): Promise; + + /** + * Transfer data with a single read or write operation + * @param port Port type (debug port or access port) + * @param mode Whether to read or write + * @param register The register to use + * @param value Any value to write + * @returns Promise of any value read + */ + transfer(port: DAPPort, mode: DAPTransferMode, register: number, value?: number): Promise; + + /** + * Transfer data with multiple read or write operations + * @param operations The operations to use + * @returns Promise of any values read + */ + transfer(operations: DAPOperation[]): Promise; + + /** + * Read a block of data from a single register + * @param port Port type (debug port or access port) + * @param register The register to use + * @returns Promise of values read + */ + transferBlock(port: DAPPort, register: number, count: number): Promise; + + /** + * Write a block of data to a single register + * @param port Port type (debug port or access port) + * @param register The register to use + * @param values The values to write + * @returns Promise + */ + transferBlock(port: DAPPort, register: number, values: Uint32Array): Promise; +} + +export { CmsisDAP } from "./cmsis-dap"; diff --git a/src/serial/serial.ts b/src/serial/serial.ts deleted file mode 100644 index 4fcfb817..00000000 --- a/src/serial/serial.ts +++ /dev/null @@ -1,55 +0,0 @@ -import {DAP} from "../dap/dap"; -import {addInt32} from "../util"; - -export class Serial { - private dap: DAP; - private timer: any; - private delay: number; - - constructor(dap: DAP) { - this.dap = dap; - } - - public async initialize(baudRate: number, delay = 200) { - this.delay = delay; - const serialConfig: number[] = []; - addInt32(serialConfig, baudRate); - await this.dap.initializeSerial(serialConfig); - } - - public async start(responseCallback?: (serialData: string) => void) { - this.timer = setInterval(async () => { - let serialData = await this.dap.readSerial(); - if (serialData.byteLength > 0) { - serialData = serialData.subarray(1); - const emptyResponse = serialData.every((c: any) => { - return c === 0; - }); - if (!emptyResponse) { - const data = Buffer.from(serialData.buffer).toString("utf8").substring(1); - responseCallback(data); - } - } - }, this.delay); - } - - public async getSerialSettings() { - return this.dap.readSerialSettings(); - } - - public async stop() { - if (this.timer) { - clearInterval(this.timer); - this.timer = null; - } - } - - public async write(data: string) { - let arrayData = []; - if (data || data !== "") { - arrayData = data.split("").map((e: any) => e.charCodeAt()); - arrayData.unshift(arrayData.length); - } - return await this.dap.writeSerial(arrayData); - } -} diff --git a/src/targets/FlashAlgorithm.ts b/src/targets/FlashAlgorithm.ts deleted file mode 100644 index a04fbb50..00000000 --- a/src/targets/FlashAlgorithm.ts +++ /dev/null @@ -1,75 +0,0 @@ -/** - * Specifies all of the parameters associated with a flashing algorithm for a particular device. These - * can be found in the pyOCD or DAPLink sources, or compiled from the source that can be found here: - * https://github.com/mbedmicro/FlashAlgo. - */ - -export interface IFlashAlgo { - analyzerAddress: number; - analyzerSupported: boolean; - loadAddress: number; - pcInit: number; - pcEraseAll: number; - pcEraseSector: number; - pcProgramPage: number; - stackPointer: number; - staticBase: number; - instructions: Uint32Array; - pageBuffers: number[]; -} - -export interface IMemoryRegion { - blocksize: number; - end: number; - length: number; - name: string; - start: number; - type: string; -} - -export class FlashAlgorithm { - public flashAlgo: IFlashAlgo; - public memoryMap: IMemoryRegion[]; - - public constructor(flashAlgorithmsData: any, deviceCode: string) { - if (deviceCode in flashAlgorithmsData) { - this.setFlashingAlgo(flashAlgorithmsData[deviceCode]); - this.setMemoryMap(flashAlgorithmsData[deviceCode]); - } - } - - private setFlashingAlgo(flashAlgorithm: any) { - const instructions = flashAlgorithm.flash_algo.instructions.map((instruction: string) => { - return parseInt(instruction, 16); - }); - const pageBuffers = flashAlgorithm.flash_algo.page_buffers.map((pageBuffer: string) => { - return parseInt(pageBuffer, 16); - }); - this.flashAlgo = { - analyzerAddress: parseInt(flashAlgorithm.flash_algo.analyzer_address, 16), - analyzerSupported: flashAlgorithm.flash_algo.analyzer_supported, - loadAddress: parseInt(flashAlgorithm.flash_algo.load_address, 16), - pcInit: parseInt(flashAlgorithm.flash_algo.pc_init, 16), - pcEraseAll: parseInt(flashAlgorithm.flash_algo.pc_eraseAll, 16), - pcEraseSector: parseInt(flashAlgorithm.flash_algo.pc_erase_sector, 16), - pcProgramPage: parseInt(flashAlgorithm.flash_algo.pc_program_page, 16), - stackPointer: parseInt(flashAlgorithm.flash_algo.begin_stack, 16), - staticBase: parseInt(flashAlgorithm.flash_algo.static_base, 16), - instructions: new Uint32Array(instructions), - pageBuffers: pageBuffers - }; - } - - private setMemoryMap(flashAlgorithm: any) { - this.memoryMap = flashAlgorithm.memory_map.map((region: any) => { - return { - blocksize: parseInt(region.blocksize, 16), - end: parseInt(region.end, 16), - length: parseInt(region.length, 16), - name: region.name, - start: parseInt(region.start, 16), - type: region.type - }; - }); - } -} diff --git a/src/targets/FlashProgram.ts b/src/targets/FlashProgram.ts deleted file mode 100644 index dadaab84..00000000 --- a/src/targets/FlashProgram.ts +++ /dev/null @@ -1,70 +0,0 @@ -import * as MemoryMap from "nrf-intel-hex"; -import {isBufferBinary} from "../util"; - -export class FlashSection { - constructor(public address: number, public data: Uint32Array) { - /* empty */ - } - - public toString() { - return `${this.data.byteLength} bytes @ ${this.address.toString(16)}`; - } -} - -/** - * # Flash Program - * - * Represents a program to be flashed to memory as a series of disjoint sections - * in memory/flash. - * - * ## Usage - * - * Use with a hex file is as simple as loading it from disk, and calling `fromIntelHex`. - * - * ```typescript - * const hexFile = "microbit.hex"; - * const hexData = fs.readFileSync(hexFile, { encoding: 'utf-8' }); - * - * const program = FlashProgram.fromIntelHex(hexData); - * core.program(program, (progress) => { - * console.log(`Flash progress: ${progress * 100}%`); - * }); - * ``` - * - * When used with a binary file, you must make sure that the file is stored in a - * Uint32Array, and you must provide a base address for the binary to be written to. - * The base address is commonly zero. - */ -export class FlashProgram { - - constructor(public sections: FlashSection[]) {} - - public static fromArrayBuffer(buffer: ArrayBuffer): FlashProgram { - if (isBufferBinary(buffer)) { - return FlashProgram.fromBinary(0, new Uint32Array(buffer)); - } - const bufferString = Buffer.from(buffer).toString("utf8"); - return FlashProgram.fromIntelHex(bufferString); - } - - public static fromIntelHex(hex: string): FlashProgram { - const hexMemory = MemoryMap.fromHex(hex); - const flashSections: FlashSection[] = []; - hexMemory.forEach((value: any, key: any) => { - flashSections.push(new FlashSection(key, new Uint32Array(value.buffer))); - }); - return new FlashProgram(flashSections); - } - - public static fromBinary(addr: number, bin: Uint32Array) { - return new FlashProgram([new FlashSection(addr, bin)]); - } - - public totalByteLength() { - return this.sections.map(s => s.data.byteLength).reduce((x, y) => x + y); - } - - public toString() { - return this.sections.toString(); - } -} diff --git a/src/targets/FlashTarget.ts b/src/targets/FlashTarget.ts deleted file mode 100644 index 0f2075b5..00000000 --- a/src/targets/FlashTarget.ts +++ /dev/null @@ -1,209 +0,0 @@ -import {CortexReg} from "../cortex/constants"; -import {CortexM} from "../cortex/cortex"; -import {DAP} from "../dap/dap"; - -import {FlashProgram} from "./FlashProgram"; -import {FlashAlgorithm} from "./FlashAlgorithm"; - -/** - * Analyzer code blob, from PyOCD. This can be used to compute a table of CRC - * values. See https://github.com/mbedmicro/pyOCD/tree/master/src/analyzer. - */ -const analyzer = new Uint32Array([ - 0x2180468c, 0x2600b5f0, 0x4f2c2501, 0x447f4c2c, 0x1c2b0049, 0x425b4033, 0x40230872, 0x085a4053, - 0x425b402b, 0x40534023, 0x402b085a, 0x4023425b, 0x085a4053, 0x425b402b, 0x40534023, 0x402b085a, - 0x4023425b, 0x085a4053, 0x425b402b, 0x40534023, 0x402b085a, 0x4023425b, 0x085a4053, 0x425b402b, - 0x40534023, 0xc7083601, 0xd1d2428e, 0x2b004663, 0x4663d01f, 0x46b4009e, 0x24ff2701, 0x44844d11, - 0x1c3a447d, 0x88418803, 0x4351409a, 0xd0122a00, 0x22011856, 0x780b4252, 0x40533101, 0x009b4023, - 0x0a12595b, 0x42b1405a, 0x43d2d1f5, 0x4560c004, 0x2000d1e7, 0x2200bdf0, 0x46c0e7f8, 0x000000b6, - 0xedb88320, 0x00000044, -]); - -/** - * # Flash Target - * - * Represents a target device containing a flash region. In rare cases that a - * target chip only has RAM, uploading a program is as simple as writing a - * block of data to memory. - * - * ## Usage - * - * Initialising the `FlashTarget` object is the same as configuring a Cortex-M - * object, but with an additional parameter for the flashing algorithm. - * - * ```typescript - * import {DAP, FlashTarget} from "dapjs"; - * - * // make sure hid is an object implementing the `IHID` interface. - * const dap = new DAP(hid); - * const flashAlgorithm = await DAPjs.FlashAlgorithm.load('0240'); - * const device = new FlashTarget(dap, flashAlgorithm); - * ``` - * - * Now, we can do all of the operations you'd expect. As usual, these examples - * work in a function marked `async`. Alternatively, they can be implemented - * using Promises directly. - * - * ```typescript - * await device.eraseChip(); - * - * // flash a hex program - * - * ``` - */ -export class FlashTarget extends CortexM { - protected flashAlgorithm: FlashAlgorithm; - private inited: boolean; - - constructor(device: DAP, flashAlgorithm: FlashAlgorithm) { - super(device); - this.inited = false; - this.flashAlgorithm = flashAlgorithm; - } - - /** - * Initialise the flash driver on the chip. Must be called before any of the other - * flash-related methods. - */ - public async flashInit() { - if (this.inited) { - return; - } - - // reset and halt - await this.reset(true); - - // make sure we're in Thumb mode. - await this.writeCoreRegister(CortexReg.XPSR, 1 << 24); - await this.writeCoreRegister(CortexReg.R9, this.flashAlgorithm.flashAlgo.staticBase); - - // upload analyzer - if (this.flashAlgorithm.flashAlgo.analyzerSupported) { - await this.memory.writeBlock(this.flashAlgorithm.flashAlgo.analyzerAddress, analyzer); - } - - const result = await this.runCode( - this.flashAlgorithm.flashAlgo.instructions, - this.flashAlgorithm.flashAlgo.loadAddress, - this.flashAlgorithm.flashAlgo.pcInit, - this.flashAlgorithm.flashAlgo.loadAddress + 1, - this.flashAlgorithm.flashAlgo.stackPointer, - true, - 0, 0, 0, 0, - ); - - this.inited = true; - return result; - } - - /** - * Erase _all_ data stored in flash on the chip. - */ - public async eraseChip() { - if (!this.inited) { - await this.flashInit(); - } - - const result = await this.runCode( - this.flashAlgorithm.flashAlgo.instructions, - this.flashAlgorithm.flashAlgo.loadAddress, - this.flashAlgorithm.flashAlgo.pcEraseAll, - this.flashAlgorithm.flashAlgo.loadAddress + 1, - this.flashAlgorithm.flashAlgo.stackPointer, - false, - 0, 0, 0, - ); - - return result; - } - - /** - * Flash a contiguous block of data to flash at a specified address. - * - * @param data Array of 32-bit integers to write to flash. - * @param address Memory address in flash to write to. - * @param progressCb Callback to keep track of progress through upload (from 0.0 to 1.0) - */ - public async flash(data: Uint32Array, address?: number, progressCb?: (progress: number) => void) { - if (!this.inited) { - await this.flashInit(); - } - - const pageSizeWords = this.flashAlgorithm.memoryMap[0].blocksize / 4; - const bufferAddress = this.flashAlgorithm.flashAlgo.pageBuffers[0]; - const flashStart = address || this.flashAlgorithm.memoryMap[0].start; - - // How far through `data` are we (in bytes) - let ptr = 0; - - while (ptr < data.byteLength) { - const wordPtr = ptr / 4; - - const pageData = data.subarray(wordPtr, wordPtr + pageSizeWords); - const flashAddress = flashStart + ptr; - - await this.memory.writeBlock(bufferAddress, pageData); - await this.runCode( - this.flashAlgorithm.flashAlgo.instructions, - this.flashAlgorithm.flashAlgo.loadAddress, - this.flashAlgorithm.flashAlgo.pcProgramPage, // pc - this.flashAlgorithm.flashAlgo.loadAddress + 1, // lr - this.flashAlgorithm.flashAlgo.stackPointer, // sp - /* upload? */ - false, - /* args */ - flashAddress, this.flashAlgorithm.memoryMap[0].blocksize, bufferAddress, - ); - - if (progressCb) { - progressCb(ptr / data.byteLength); - } - ptr += pageData.byteLength; - } - - if (progressCb) { - progressCb(1.0); - } - } - - /** - * Upload a program consisting of one or more disjoint sections to flash. - * - * @param program Program to be uploaded - * @param progressCb Callback to receive progress updates (from 0.0 to 1.0) - */ - public async program(program: FlashProgram, progressCb: (progress: number) => void) { - await this.flashInit(); - await this.eraseChip(); - - const totalBytes = program.totalByteLength(); - let cumulativeBytes = 0; - - // const startTime = Date.now(); - - for (const section of program.sections) { - await this.flash(section.data, section.address, progress => { - const sectionBytes = section.data.byteLength * progress; - progressCb((cumulativeBytes + sectionBytes) / totalBytes); - }); - - cumulativeBytes += section.data.byteLength; - } - - // const endTime = Date.now(); - // const elapsedTime = endTime - startTime; - - // const transferRate = totalBytes / elapsedTime; // B/ms == kB/s - - await this.flashUnInit(); - progressCb(1.0); - } - - /** - * Un-init the flash algorithm. Commonly, we use this to ensure that the flashing - * algorithms are re-uploaded after resets. - */ - public flashUnInit() { - this.inited = false; - } -} diff --git a/src/targets/PlatformSelector.ts b/src/targets/PlatformSelector.ts deleted file mode 100644 index 7a075c11..00000000 --- a/src/targets/PlatformSelector.ts +++ /dev/null @@ -1,36 +0,0 @@ - -export interface IPlatform { - name: string; - productCode: string; -} - -export class PlatformSelector { - private deviceCache: Map; - - constructor() { - this.deviceCache = new Map(); - } - - public async lookupDevice(code: string) { - if (this.deviceCache.has(code)) { - return this.deviceCache.get(code); - } - - const xhr = new XMLHttpRequest(); - xhr.open("get", `https://os.mbed.com/api/v3/platforms/${code}/`, true); - xhr.responseType = "json"; - - return new Promise((resolve, _reject) => { - xhr.onload = (_e: any) => { - const device = { - id: xhr.response.id, - name: xhr.response.name, - productCode: xhr.response.productcode, - }; - this.deviceCache.set(code, device); - resolve(device); - }; - xhr.send(); - }); - } -} diff --git a/src/transport/cmsis_dap.ts b/src/transport/cmsis_dap.ts deleted file mode 100644 index f183774d..00000000 --- a/src/transport/cmsis_dap.ts +++ /dev/null @@ -1,153 +0,0 @@ -import {addInt32} from "../util"; -import {IHID} from "./hid"; - -export const enum DapCmd { - DAP_INFO = 0x00, - DAP_LED = 0x01, - DAP_CONNECT = 0x02, - DAP_DISCONNECT = 0x03, - DAP_TRANSFER_CONFIGURE = 0x04, - DAP_TRANSFER = 0x05, - DAP_TRANSFER_BLOCK = 0x06, - DAP_TRANSFER_ABORT = 0x07, - DAP_WRITE_ABORT = 0x08, - DAP_DELAY = 0x09, - DAP_RESET_TARGET = 0x0a, - DAP_SWJ_PINS = 0x10, - DAP_SWJ_CLOCK = 0x11, - DAP_SWJ_SEQUENCE = 0x12, - DAP_SWD_CONFIGURE = 0x13, - DAP_JTAG_SEQUENCE = 0x14, - DAP_JTAG_CONFIGURE = 0x15, - DAP_JTAG_IDCODE = 0x16, - DAP_VENDOR0 = 0x80, - DAP_VENDOR1 = 0x81, - DAP_VENDOR2 = 0x82, - DAP_VENDOR3 = 0x83, - DAP_VENDOR4 = 0x84, - DAP_VENDOR5 = 0x85 -} - -const enum Info { - VENDOR_ID = 0x01, - PRODUCT_ID = 0x02, - SERIAL_NUMBER = 0x03, - CMSIS_DAP_FW_VERSION = 0x04, - TARGET_DEVICE_VENDOR = 0x05, - TARGET_DEVICE_NAME = 0x06, - CAPABILITIES = 0xf0, - PACKET_COUNT = 0xfe, - PACKET_SIZE = 0xff, -} - -export class CMSISDAP { - private hid: IHID; - // private maxSent = 1; - - constructor(hid: IHID) { - this.hid = hid; - } - - public async resetTarget() { - return this.cmdNums(DapCmd.DAP_RESET_TARGET, []); - } - - public async disconnect() { - return this.cmdNums(DapCmd.DAP_DISCONNECT, []); - } - - public async cmdNums(op: DapCmd, data: number[]) { - data.unshift(op); - - const buf = await this.send(data); - - if (buf[0] !== op) { - throw new Error(`Bad response for ${op} -> ${buf[0]}`); - } - - switch (op) { - case DapCmd.DAP_CONNECT: - case DapCmd.DAP_INFO: - case DapCmd.DAP_TRANSFER: - case DapCmd.DAP_TRANSFER_BLOCK: - break; - case DapCmd.DAP_VENDOR1: - case DapCmd.DAP_VENDOR2: - case DapCmd.DAP_VENDOR3: - case DapCmd.DAP_VENDOR4: - case DapCmd.DAP_VENDOR5: - break; - default: - if (buf[1] !== 0) { - throw new Error(`Bad status for ${op} -> ${buf[1]}`); - } - } - - return buf; - } - - public async connect() { - const v = await this.info(Info.PACKET_COUNT); - if (v as number) { - // this.maxSent = v as number; - } else { - throw new Error("DAP_INFO returned invalid packet count."); - } - - await this.cmdNums(DapCmd.DAP_SWJ_CLOCK, addInt32(null, 10000000)); - - const buf = await this.cmdNums(DapCmd.DAP_CONNECT, [0]); - if (buf[1] !== 1) { - throw new Error("SWD mode not enabled."); - } - - await this.cmdNums(DapCmd.DAP_SWJ_CLOCK, addInt32(null, 10000000)); - await this.cmdNums(DapCmd.DAP_TRANSFER_CONFIGURE, [0, 0x50, 0, 0, 0]); - await this.cmdNums(DapCmd.DAP_SWD_CONFIGURE, [0]); - await this.jtagToSwd(); - } - - private async jtagToSwd() { - const arrs = [ - [56, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff], - [16, 0x9e, 0xe7], - [56, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff], - [8, 0x00], - ]; - - for (const arr of arrs) { - await this.swjSequence(arr); - } - } - - private async swjSequence(data: number[]) { - return this.cmdNums(DapCmd.DAP_SWJ_SEQUENCE, data); - } - - private async info(id: Info) { - const buf = await this.cmdNums(DapCmd.DAP_INFO, [id]); - - if (buf[1] === 0) { - return null; - } - - switch (id) { - case Info.CAPABILITIES: - case Info.PACKET_COUNT: - case Info.PACKET_SIZE: - if (buf[1] === 1) { - return buf[2]; - } else if (buf[1] === 2) { - return buf[3] << 8 | buf[2]; - } - } - return buf.subarray(2, buf[1] + 2 - 1); // .toString("utf8") - } - - private async send(command: number[]) { - const array = Uint8Array.from(command); - await this.hid.write(array.buffer); - const response = await this.hid.read(); - return new Uint8Array(response.buffer); - } -} diff --git a/src/transport/hid.ts b/src/transport/hid.ts index dc2ae8bf..bbad5d3c 100644 --- a/src/transport/hid.ts +++ b/src/transport/hid.ts @@ -1,112 +1,130 @@ -export interface IHID { - write(data: ArrayBuffer): Promise; - read(): Promise; - close(): Promise; -} +/* +* DAPjs +* Copyright Arm Limited 2018 +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in all +* copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +*/ -function bufferExtend(source: ArrayBuffer, length: number) { - const sarr = new Uint8Array(source); +import { platform } from "os"; +import { HID as nodeHID, Device } from "node-hid"; +import { Transport } from "./"; - const dest = new ArrayBuffer(length); - const darr = new Uint8Array(dest); +/** + * HID Transport class + */ +export class HID implements Transport { - for (let i = 0; i < Math.min(source.byteLength, length); i++) { - darr[i] = sarr[i]; - } + private os: string = platform(); + private path: string = null; + private device: nodeHID = null; + public readonly packetSize = 64; - return dest; -} + /** + * HID constructor + * @param path Path to HID device to use + */ + constructor(deviceOrPath: Device | string) { + function isDevice(source: Device | string): source is Device { + return (source as Device).path !== undefined; + } -export class HID { - private device: USBDevice; - private interfaces: USBInterface[]; - private interface: USBInterface; - private endpoints: USBEndpoint[]; - private epIn: USBEndpoint; - private epOut: USBEndpoint; - private useControlTransfer: boolean; - private packetSize = 64; - private controlTransferGetReport = 0x01; - private controlTransferSetReport = 0x09; - private controlTransferOutReport = 0x200; - private controlTransferInReport = 0x100; - - constructor(device: USBDevice) { - this.device = device; + this.path = isDevice(deviceOrPath) ? deviceOrPath.path : deviceOrPath; } - public async open(hidInterfaceClass = 0xFF, useControlTransfer = true) { - this.useControlTransfer = useControlTransfer; - await this.device.open(); - await this.device.selectConfiguration(1); - const hids = this.device.configuration.interfaces.filter( - intf => intf.alternates[0].interfaceClass === hidInterfaceClass); + /** + * Open device + * @returns Promise + */ + public open(): Promise { + return new Promise((resolve, reject) => { + if (!this.path.length) { + return reject("No path specified"); + } - if (hids.length === 0) { - throw new Error("No HID interfaces found."); - } + try { + this.device = new nodeHID(this.path); + resolve(); + } catch (ex) { + reject(ex); + } + }); + } - this.interfaces = hids; + /** + * Close device + * @returns Promise + */ + public close(): Promise { + return new Promise((resolve, _reject) => { + if (this.device) { + this.device.close(); + this.device = null; + } - if (this.interfaces.length === 1) { - this.interface = this.interfaces[0]; - } - await this.device.claimInterface(this.interface.interfaceNumber); - this.endpoints = this.interface.alternates[0].endpoints; + resolve(); + }); + } - this.epIn = null; - this.epOut = null; + /** + * Read from device + * @returns Promise of DataView + */ + public read(): Promise { + return new Promise((resolve, reject) => { + this.device.read((error: string, data: number[]) => { + if (error) { + return reject(error); + } - for (const endpoint of this.endpoints) { - if (endpoint.direction === "in") { - this.epIn = endpoint; - } else { - this.epOut = endpoint; - } - } + const buffer = new Uint8Array(data).buffer; + resolve(new DataView(buffer)); + }); + }); } - public async close() { - return this.device.close(); - } + /** + * Write to device + * @param data Data to write + * @returns Promise + */ + public write(data: BufferSource): Promise { + return new Promise((resolve, reject) => { + function isView(source: ArrayBuffer | ArrayBufferView): source is ArrayBufferView { + return (source as ArrayBufferView).buffer !== undefined; + } - public async write(data: ArrayBuffer): Promise { - if (this.epOut && !this.useControlTransfer) { - const reportSize = this.epOut.packetSize; - const buffer = bufferExtend(data, reportSize); - return this.device.transferOut(this.epOut.endpointNumber, buffer); - } else { - // Device does not have out endpoint. Send data using control transfer - const buffer = bufferExtend(data, this.packetSize); - return this.device.controlTransferOut( - { - requestType: "class", - recipient: "interface", - request: this.controlTransferSetReport, - value: this.controlTransferOutReport, - index: this.interface.interfaceNumber - }, - buffer - ); - } - } + const arrayBuffer = isView(data) ? data.buffer : data; + const array = Array.prototype.slice.call(new Uint8Array(arrayBuffer)); - public async read(): Promise { - if (this.epIn && !this.useControlTransfer) { - const reportSize = this.epIn.packetSize; - return this.device.transferIn(this.epIn.endpointNumber, reportSize) - .then(res => res.data); - } else { - return this.device.controlTransferIn( - { - requestType: "class", - recipient: "interface", - request: this.controlTransferGetReport, - value: this.controlTransferInReport, - index: this.interface.interfaceNumber - }, - this.packetSize - ).then(res => res.data); - } + // Pad to packet size + while (array.length < this.packetSize) array.push(0); + + // Windows requires the prepend of an extra byte + // https://github.com/node-hid/node-hid/blob/master/README.md#prepend-byte-to-hid_write + if (this.os === "win32") { + array.unshift(0); // prepend throwaway byte + } + + const bytesWritten = this.device.write(array); + if (bytesWritten !== array.length) return reject("Incorrect bytecount written"); + + resolve(); + }); } } diff --git a/src/transport/index.ts b/src/transport/index.ts new file mode 100644 index 00000000..09007dd8 --- /dev/null +++ b/src/transport/index.ts @@ -0,0 +1,61 @@ +/* +* DAPjs +* Copyright Arm Limited 2018 +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in all +* copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +*/ + +/** + * USB transport + */ +export interface Transport { + /** + * Packet size + */ + packetSize: number; + + /** + * Open device + * @returns Promise + */ + open(): Promise; + + /** + * Close device + * @returns Promise + */ + close(): Promise; + + /** + * Read from device + * @returns Promise of DataView + */ + read(): Promise; + + /** + * Write to device + * @param data Data to write + * @returns Promise + */ + write(data: BufferSource): Promise; +} + +export { HID } from "./hid"; +export { USB } from "./usb"; +export { WebUSB } from "./webusb"; diff --git a/src/transport/usb.ts b/src/transport/usb.ts new file mode 100644 index 00000000..f4692c0a --- /dev/null +++ b/src/transport/usb.ts @@ -0,0 +1,231 @@ +/* +* DAPjs +* Copyright Arm Limited 2018 +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in all +* copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +*/ + +import { + LIBUSB_REQUEST_TYPE_CLASS, + LIBUSB_RECIPIENT_INTERFACE, + LIBUSB_ENDPOINT_IN, + LIBUSB_ENDPOINT_OUT, + Device, + InEndpoint, + OutEndpoint +} from "usb"; +import { Transport } from "./"; + +/** + * @hidden + */ +const DEFAULT_CONFIGURATION = 1; +/** + * @hidden + */ +const DEFAULT_CLASS = 0xFF; + +/** + * @hidden + */ +const GET_REPORT = 0x01; +/** + * @hidden + */ +const SET_REPORT = 0x09; +/** + * @hidden + */ +const OUT_REPORT = 0x200; +/** + * @hidden + */ +const IN_REPORT = 0x100; + +/** + * USB Transport class + */ +export class USB implements Transport { + + private interfaceNumber: number; + private endpointIn: InEndpoint; + private endpointOut: OutEndpoint; + public readonly packetSize = 64; + + /** + * USB constructor + * @param device USB device to use + * @param interfaceClass Optional interface class to use (default: 0xFF) + * @param configuration Optional Configuration to use (default: 1) + * @param alwaysControlTransfer Whether to always use control transfer instead of endpoints (default: false) + */ + constructor(private device: Device, private interfaceClass = DEFAULT_CLASS, private configuration = DEFAULT_CONFIGURATION, private alwaysControlTransfer: boolean = false) { + } + + private bufferToDataView(buffer: Buffer): DataView { + const arrayBuffer = new Uint8Array(buffer).buffer; + return new DataView(arrayBuffer); + } + + private bufferSourceToBuffer(bufferSource: ArrayBuffer | ArrayBufferView): Buffer { + function isView(source: ArrayBuffer | ArrayBufferView): source is ArrayBufferView { + return (source as ArrayBufferView).buffer !== undefined; + } + + const arrayBuffer = isView(bufferSource) ? bufferSource.buffer : bufferSource; + return new Buffer(arrayBuffer); + } + + private extendBuffer(data: BufferSource, packetSize: number): BufferSource { + function isView(source: ArrayBuffer | ArrayBufferView): source is ArrayBufferView { + return (source as ArrayBufferView).buffer !== undefined; + } + + const arrayBuffer = isView(data) ? data.buffer : data; + const length = Math.min(arrayBuffer.byteLength, packetSize); + + const result = new Uint8Array(length); + result.set(new Uint8Array(arrayBuffer)); + + return result; + } + + /** + * Open device + * @returns Promise + */ + public open(): Promise { + return new Promise((resolve, reject) => { + this.device.open(); + this.device.setConfiguration(this.configuration, error => { + if (error) return reject(error); + const interfaces = this.device.interfaces.filter(iface => { + return iface.descriptor.bInterfaceClass === this.interfaceClass; + }); + + if (!interfaces.length) { + throw new Error("No valid interfaces found."); + } + + const selectedInterface = interfaces[0]; + this.interfaceNumber = selectedInterface.interfaceNumber; + + // If we always want to use control transfer, don't find/set endpoints and claim interface + if (!this.alwaysControlTransfer) { + const endpoints = selectedInterface.endpoints; + + this.endpointIn = null; + this.endpointOut = null; + + for (const endpoint of endpoints) { + if (endpoint.direction === "in") this.endpointIn = (endpoint as InEndpoint); + else this.endpointOut = (endpoint as OutEndpoint); + } + + // If endpoints are found, claim the interface + if (this.endpointIn || this.endpointOut) { + + // If the interface can't be claimed, use control transfer + try { + selectedInterface.claim(); + } catch (_e) { + this.endpointIn = null; + this.endpointOut = null; + } + } + } + + resolve(); + }); + }); + } + + /** + * Close device + * @returns Promise + */ + public close(): Promise { + return new Promise((resolve, _reject) => { + this.device.close(); + resolve(); + }); + } + + /** + * Read from device + * @returns Promise of DataView + */ + public read(): Promise { + return new Promise((resolve, reject) => { + // Use endpoint if it exists + if (this.endpointIn) { + return this.endpointIn.transfer(this.packetSize, (error, buffer) => { + if (error) return reject(error); + resolve(this.bufferToDataView(buffer)); + }); + } + + // Fallback to using control transfer + this.device.controlTransfer( + LIBUSB_ENDPOINT_IN | LIBUSB_REQUEST_TYPE_CLASS | LIBUSB_RECIPIENT_INTERFACE, + GET_REPORT, + IN_REPORT, + this.interfaceNumber, + this.packetSize, + (error, buffer) => { + if (error) return reject(error); + resolve(this.bufferToDataView(buffer)); + } + ); + }); + } + + /** + * Write to device + * @param data Data to write + * @returns Promise + */ + public write(data: BufferSource): Promise { + const extended = this.extendBuffer(data, this.packetSize); + const buffer = this.bufferSourceToBuffer(extended); + + return new Promise((resolve, reject) => { + // Use endpoint if it exists + if (this.endpointOut) { + return this.endpointOut.transfer(buffer, error => { + if (error) return reject(error); + resolve(); + }); + } + + // Fallback to using control transfer + this.device.controlTransfer( + LIBUSB_ENDPOINT_OUT | LIBUSB_REQUEST_TYPE_CLASS | LIBUSB_RECIPIENT_INTERFACE, + SET_REPORT, + OUT_REPORT, + this.interfaceNumber, + buffer, + error => { + if (error) return reject(error); + resolve(); + } + ); + }); + } +} diff --git a/src/transport/webusb.ts b/src/transport/webusb.ts new file mode 100644 index 00000000..43794fb4 --- /dev/null +++ b/src/transport/webusb.ts @@ -0,0 +1,151 @@ +/* +* DAPjs +* Copyright Arm Limited 2018 +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in all +* copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +*/ + +import { Transport } from "./"; + +/** + * @hidden + */ +const DEFAULT_CONFIGURATION = 1; +/** + * @hidden + */ +const DEFAULT_CLASS = 0xFF; + +/** + * @hidden + */ +const GET_REPORT = 0x01; +/** + * @hidden + */ +const SET_REPORT = 0x09; +/** + * @hidden + */ +const OUT_REPORT = 0x200; +/** + * @hidden + */ +const IN_REPORT = 0x100; + +/** + * WebUSB Transport class + * https://wicg.github.io/webusb/ + */ +export class WebUSB implements Transport { + + private interfaceNumber: number; + public readonly packetSize = 64; + + /** + * WebUSB constructor + * @param device WebUSB device to use + * @param interfaceClass Optional interface class to use (default: 0xFF) + * @param configuration Optional Configuration to use (default: 1) + */ + constructor(private device: USBDevice, private interfaceClass = DEFAULT_CLASS, private configuration = DEFAULT_CONFIGURATION) { + } + + private extendBuffer(data: BufferSource, packetSize: number): BufferSource { + function isView(source: ArrayBuffer | ArrayBufferView): source is ArrayBufferView { + return (source as ArrayBufferView).buffer !== undefined; + } + + const arrayBuffer = isView(data) ? data.buffer : data; + const length = Math.min(arrayBuffer.byteLength, packetSize); + + const result = new Uint8Array(length); + result.set(new Uint8Array(arrayBuffer)); + + return result; + } + + /** + * Open device + * @returns Promise + */ + public open(): Promise { + return this.device.open() + .then(() => this.device.selectConfiguration(this.configuration)) + .then(() => { + const interfaces = this.device.configuration.interfaces.filter(iface => { + return iface.alternates[0].interfaceClass === this.interfaceClass; + }); + + if (!interfaces.length) { + throw new Error("No valid interfaces found."); + } + + this.interfaceNumber = interfaces[0].interfaceNumber; + return this.device.claimInterface(this.interfaceNumber); + }); + } + + /** + * Close device + * @returns Promise + */ + public close(): Promise { + return this.device.close(); + } + + /** + * Read from device + * @returns Promise of DataView + */ + public read(): Promise { + return this.device.controlTransferIn( + { + requestType: "class", + recipient: "interface", + request: GET_REPORT, + value: IN_REPORT, + index: this.interfaceNumber + }, + this.packetSize + ) + .then(result => result.data); + } + + /** + * Write to device + * @param data Data to write + * @returns Promise + */ + public write(data: BufferSource): Promise { + const buffer = this.extendBuffer(data, this.packetSize); + + return this.device.controlTransferOut( + { + requestType: "class", + recipient: "interface", + request: SET_REPORT, + value: OUT_REPORT, + index: this.interfaceNumber + }, + buffer + ) + .then(() => undefined); + } +} diff --git a/src/typings/IntelHex.d.ts b/src/typings/IntelHex.d.ts deleted file mode 100644 index 6287a21d..00000000 --- a/src/typings/IntelHex.d.ts +++ /dev/null @@ -1 +0,0 @@ -declare module "nrf-intel-hex"; diff --git a/src/util.ts b/src/util.ts deleted file mode 100644 index 06a5c8cb..00000000 --- a/src/util.ts +++ /dev/null @@ -1,130 +0,0 @@ -import {ApReg, DapVal, Reg} from "./dap/constants"; - -export const readUInt32LE = (b: Uint8Array, idx: number) => { - return (b[idx] | - (b[idx + 1] << 8) | - (b[idx + 2] << 16) | - (b[idx + 3] << 24)) >>> 0; -}; - -export const bufferConcat = (bufs: Uint8Array[]) => { - let len = 0; - for (const b of bufs) { - len += b.length; - } - const r = new Uint8Array(len); - len = 0; - for (const b of bufs) { - r.set(b, len); - len += b.length; - } - return r; -}; - -export const delay = async (t: number) => { - return new Promise(resolve => { - setTimeout(resolve, t); - }); -}; - -export const addInt32 = (arr: number[], val: number) => { - if (!arr) { - arr = []; - } - - arr.push(val & 0xff, (val >> 8) & 0xff, (val >> 16) & 0xff, (val >> 24) & 0xff); - return arr; -}; - -export const hex = (v: number) => { - return "0x" + v.toString(16); -}; - -export const rid = (v: number) => { - const m = [ - "DP_0x0", - "DP_0x4", - "DP_0x8", - "DP_0xC", - "AP_0x0", - "AP_0x4", - "AP_0x8", - "AP_0xC", - ]; - - return m[v] || "?"; -}; - -export const bank = (addr: number) => { - const APBANKSEL = 0x000000f0; - return (addr & APBANKSEL) | (addr & 0xff000000); -}; - -export const apReg = (r: ApReg, mode: DapVal) => { - const v = r | mode | DapVal.AP_ACC; - return (4 + ((v & 0x0c) >> 2)) as Reg; -}; - -export const bufToUint32Array = (buf: Uint8Array) => { - assert((buf.length & 3) === 0); - - const r: number[] = []; - - if (!buf.length) { - return r; - } - - r[buf.length / 4 - 1] = 0; - - for (let i = 0; i < r.length; ++i) { - r[i] = readUInt32LE(buf, i << 2); - } - - return r; -}; - -export const assert = (cond: any) => { - if (!cond) { - throw new Error("assertion failed"); - } -}; - -export const regRequest = (regId: number, isWrite = false) => { - let request = !isWrite ? DapVal.READ : DapVal.WRITE; - - if (regId < 4) { - request |= DapVal.DP_ACC; - } else { - request |= DapVal.AP_ACC; - } - - request |= (regId & 3) << 2; - - return request; -}; - -export const hexBytes = (bytes: number[]) => { - let chk = 0; - let r = ":"; - - bytes.forEach(b => chk += b); - bytes.push((-chk) & 0xff); - bytes.forEach(b => r += ("0" + b.toString(16)).slice(-2)); - - return r.toUpperCase(); -}; - -export const isBufferBinary = (buffer: ArrayBuffer): boolean => { - // detect if buffer contains text or binary data - const lengthToCheck = buffer.byteLength > 50 ? 50 : buffer.byteLength; - const bufferString = Buffer.from(buffer).toString("utf8"); - for (let i = 0; i < lengthToCheck; i++) { - const charCode = bufferString.charCodeAt(i); - // 65533 is a code for unknown character - // 0-8 are codes for control characters - if (charCode === 65533 || charCode <= 8) { - return true; - } - } - return false; -}; diff --git a/tsconfig.json b/tsconfig.json index 5b51f05b..b059d219 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,10 +1,11 @@ { "compilerOptions": { - "target": "es6", + "target": "es5", "module": "commonjs", "lib": [ - "es6", - "dom" + "es5", + "dom", + "es2015.promise" ], "alwaysStrict": true, "noEmitOnError": true, diff --git a/tslint.json b/tslint.json index 65fb6cba..96f5d0c1 100644 --- a/tslint.json +++ b/tslint.json @@ -9,7 +9,7 @@ "brace-style": [true, "1tbs", { "allowSingleLine": true }], "curly": [true, "ignore-same-line"], "eofline": true, - "interface-name": [true, "always-prefix"], + "interface-name": [true, "never-prefix"], "linebreak-style": [true, "LF"], "max-classes-per-file": [false], "max-line-length": [false], @@ -24,7 +24,6 @@ "object-literal-sort-keys": false, "ordered-imports": [true, { "import-sources-order": "any", "named-imports-order": "any" }], "prefer-const": true, - "promise-function-async": true, "semicolon": [true, "always"], "ter-indent": [true, 4, { "SwitchCase": true }], "ter-no-irregular-whitespace": [true],