diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 00000000..b2df1a34 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,105 @@ +# AGENTS.md — Build & dev notes for agents + +## Build command + +From the repo root, inside the NCS shell (v3.0.1 toolchain in +`~/ncs/toolchains/7cbc0036f4/`). This is exactly what the user's editor +tooling runs, verbatim — run this same command when building by hand so the +two invocations share a cache: + +``` +west build --build-dir /home/than/code/subvocal/open-earable-2/build \ + /home/than/code/subvocal/open-earable-2 \ + --pristine --board openearable_v2/nrf5340/cpuapp \ + -- \ + -DDEBUG_THREAD_INFO=Off \ + -Dopen-earable-2_DEBUG_THREAD_INFO=Off \ + -Dmcuboot_DEBUG_THREAD_INFO=Off \ + -Dipc_radio_DEBUG_THREAD_INFO=Off \ + -Db0n_DEBUG_THREAD_INFO=Off \ + -DBOARD_ROOT=/home/than/code/subvocal/open-earable-2 +``` + +Incremental re-build once the cache exists (no `--pristine`): + +``` +west build --build-dir /home/than/code/subvocal/open-earable-2/build +``` + +### Why the flags look like this + +- Build directory is `build/` (flat) — **not** `build/open-earable-2/`. + Sysbuild then puts each sub-image under `build//`. +- **Sysbuild is auto-detected** from the repo's top-level `sysbuild.conf`; + `--sysbuild` doesn't need to be passed explicitly. `sysbuild.conf` enables + MCUboot for cpuapp + cpunet and external-flash DFU, so a non-sysbuild + build would **silently skip mcuboot and ipc_radio** while the main app + links fine. If you ever see only one image linking, you're in that trap. +- `--pristine` wipes the cache every time; the editor tooling does this + so per-image sysbuild defines are applied cleanly. For hand-run + incremental builds, drop `--pristine` (see the incremental form above). +- `-D_DEBUG_THREAD_INFO=Off` silences per-image thread-info debug + across all sysbuild sub-targets (`open-earable-2`, `mcuboot`, + `ipc_radio`, `b0n`). +- The custom board `openearable_v2` lives at `boards/teco/openearable_v2/` + (not in the NCS tree), so `-DBOARD_ROOT=` is always required. + +### Board qualifier + +`openearable_v2/nrf5340/cpuapp`. The `_ns` variant exists in `board.yml` +(TF-M non-secure) but the firmware targets the secure cpuapp core. + +### Output artifacts + +Under `build/`: +- `open-earable-2/zephyr/zephyr.elf` — main app +- `mcuboot/zephyr/zephyr.elf` — bootloader +- `ipc_radio/zephyr/zephyr.elf` — net-core image +- `merged.hex`, `merged_CPUNET.hex` — flashable combined images +- `dfu_application.zip` — MCUmgr / FOTA bundle +- `signed_by_mcuboot_and_b0_ipc_radio.hex` — signed net-core for DFU + +### Flashing / DFU + +`tools/flash/flash.sh` for J-Link; `tools/flash/mcu-manager_upload.sh` for +MCUmgr-over-BLE DFU. See `tools/flash/` for the canonical invocations. + +## DTS binding locations + +Board-specific bindings (those referenced by the board's `_common.dts`) must +live under `boards/teco/openearable_v2/dts/bindings/`, not the top-level +`dts/bindings/`. Reason: sub-images under sysbuild (mcuboot, ipc_radio) don't +search the main app's `dts/bindings/`, but they **do** search `BOARD_DIR/dts/ +bindings/`. A binding that only lives at the top level will compile the main +app fine and then fail the mcuboot sub-image with `lacks binding` or +`lacks #power-domain-cells` — which is easy to miss if you only tail the +first image's output. + +Current board-local bindings: +- `load-switch.yaml` — GPIO-gated power rail; acts as a power-domain + controller for devices that reference it via `power-domains`. + +## Power management (see POWER_DESCRIPTION.md, SYSTEM_DESCRIPTION.md) + +- Three load switches: `ls_1_8` (gpio1.11), `ls_3_3` (BQ25120A LDO, + gpio0.14), `ls_sd` (gpio1.12). All three have + `zephyr,pm-device-runtime-auto` in DTS. +- `mx25r64` has `power-domains = <&load_switch>;` so the `spi_nor` + driver's `pm_device_driver_init` sees the parent as unpowered and skips + chip init at boot — the fix for the classic `spi_nor_wait_until_ready` + hang when `ls_1_8` is off. +- DFU picks up `ls_1_8` via the MCUmgr hook in + `src/utils/StateIndicator.cpp` (`MGMT_EVT_OP_IMG_MGMT_DFU_STARTED` → + `pm_device_runtime_get(mx25r64)`). +- `mcuboot_hook.c::init_load_switch` runs at `SYS_INIT(PRE_KERNEL_2, 80)` + inside mcuboot and drives `gpio1.11` + `gpio0.14` HIGH before mcuboot + touches the flash. This keeps mcuboot working without needing + `CONFIG_PM_DEVICE_POWER_DOMAIN` in the mcuboot config. + +## User preferences (from memory) + +- Run the user-given command verbatim from repo root; don't `cd` or rewrite + paths. +- Don't speculate about root causes; read the current state before editing. +- The user provides the NCS shell for builds — but we can run the build + ourselves when asked, using the command above. diff --git a/CODE_ASSESSMENT.md b/CODE_ASSESSMENT.md new file mode 100644 index 00000000..abeede7e --- /dev/null +++ b/CODE_ASSESSMENT.md @@ -0,0 +1,184 @@ +# OpenEarable v2 Firmware — Code Quality Assessment + +## Summary + +The project-specific code is functional but still has meaningful quality issues across thread safety, error handling, memory safety, and architectural cohesion. Several concerns from the prior pass have been addressed by recent work (major power refactor, sensor_sink introduction, Bosch BMI160 replacing the DFRobot BMX160 driver, card-detect rails fix), but a core set of thread-safety and memory-safety issues remains. Below is a prioritized breakdown reflecting the current state of the tree. + +--- + +## Recent Progress (context for this revision) + +- **Major power refactor** — `PowerManager.cpp` shrank substantially (~880 lines now); control flow around mounting, load switches, and charging is cleaner. The BQ25120a interrupt handling has been documented. +- **sensor_sink** — new `include/sensor_sink.h` + `src/SensorManager/sensor_sink.cpp` centralize how sensors deliver data to both BLE and SD sinks, removing the prior `audio_datapath` wrapper and trimming `SensorManager` by ~70 lines. +- **BMX160 → Bosch BMI160** — the DFRobot driver was replaced with the official Bosch reference driver plus a thin `BMX160_Sensor` wrapper. BMX160 suspend mode is now implemented. +- **SD card-detect** — pre-rails card detection issue understood; `sd_state` GPIO requires `ls_1_8` + `ls_sd` to be powered before it can read. +- **Duplicate include fixed** — `sensor_service.h` is now included only once in `SensorManager.cpp`. +- **Dead placeholders cleaned** — e.g. `Baro.cpp`'s commented-out `bmp.start()` and the "pulse oximeter" copy-paste in `BoneConduction.cpp::reset()` are gone. +- **Header guard fixed** — `led_service.h` no longer uses `AUDIO_PLAYER_H`. + +--- + +## Critical Issues + +### 1. Thread Safety — Pervasive Race Conditions + +Nearly every module still has shared mutable state accessed from ISR callbacks, work queues, and threads without synchronization: + +- **`Wire.cpp`** — mutex locking is **still commented out** for the primary I2C transaction paths (lines 81, 93, 98, 104, 107, 113). A second lock pair at lines 156/160 *is* active, so protection is inconsistent within the same file. +- **`SensorManager.cpp`** — `active_sensors` counter is modified from multiple contexts. The recent sensor_sink refactor simplified data delivery but did not introduce an atomic or mutex around this counter. +- **`PowerManager.cpp`** — `charging_disabled`, `last_charging_state`, and related flags are touched from ISR callbacks without atomics or mutexes. The ZBUS adoption for some paths reduces exposure but does not eliminate it. +- **`time_sync.c`** — `time_offset_us` is written by BLE callback (~line 144) and read by `get_current_time_us()` (~lines 160–173); no synchronization. +- **Sensor classes** — `_active`, `_running`, `_ble_stream` booleans are still accessed from timer interrupts and main thread without atomics. +- **Sensors still set `_active = false` *before* calling `k_timer_stop()`** — confirmed in `Baro.cpp` (line 112 vs 121) and `IMU.cpp` (line 152 vs 165). The timer can fire on a deactivated sensor. Stop the timer first. +- **`sensor_service.c`** — `connection_complete` modified in ISR context (~line 53) but read in thread context (~line 206) without synchronization. +- **`led.c`** — `on_phase` static variable in `led_blink_work_handler` and `led_units` array modified without synchronization. +- **`Button.cpp`** — `button_cb_data` is static (line 13) but written per-instance; cross-instance ISR interference if a second button is ever registered. + +### 2. Silent Error Swallowing + +Return codes are logged but not propagated; the system continues in degraded states without callers knowing: + +- **`BQ25120a.cpp` / `BQ27220.cpp`** — I2C read failures still return stale data (e.g. `voltage()` returns 0.0 on I2C failure, indistinguishable from a dead battery). +- **`BQ25120a.cpp` (`readReg`)** — returns success even when `i2c_burst_read()` fails. +- **`main.cpp:~87`** — USB init failure still returns 0 (success). +- **`PowerManager.cpp`** — multiple `pm_device_action_run()` calls have ignored return values (~lines 580–582, 607, 835, 839). +- **`sensor_service.c`** — still uses a busy-wait loop `while(notify_count >= MAX_NOTIFIES_IN_FLIGHT) { k_yield(); }` instead of a semaphore. +- **`PowerManager.cpp`** — load switch enable errors are logged as warnings and execution continues regardless. + +### 3. Memory Safety + +- **`uicr.c`** — **known memory collision**: `MEM_ADDR_UICR_SNR` is 8 bytes wide but `MEM_ADDR_UICR_CH` is placed only 4 bytes after it, causing overlap. Comment acknowledging this is still present (~line 80). +- **`SensorScheme.cpp:351`** — `sensorSchemesMap[id]` still uses `operator[]`, which **creates** entries for missing keys. Should use `.find()`. +- **`BQ27220.cpp:343`** — `k_malloc()` with no null check. +- **`BQ27220.cpp:315`** — VLA `uint8_t buf[len]` is non-standard C++ and allocates an unknown size on the stack. +- **`streamctrl.c:~575`** — `memcpy(chip_id, data, sizeof(chip_id))` still assumes `data` has at least 8 bytes, no bounds check. +- **`Equalizer.cpp:~39`** — `data[n]` loop increments by 2 with no odd-length guard. +- **`sensor_service.c`** — `active_sensor_configs` allocated with `k_malloc()`/`k_realloc()` (~lines 237–278) but never freed. +- **`Wire.cpp:~118–124`** — TX buffer writes with no overflow check; silent truncation. + +### 4. Unsafe Enum / Type Casts + +- **`SensorManager.cpp:~134`** — raw cast `(enum sensor_id) config.sensorId` from untrusted BLE data, no bounds check. +- **`Button.cpp:33`** — `gpio_pin_get_dt()` return (int) cast directly to `button_action` enum. +- **`time_sync.c:~168`** — integer overflow check happens **after** the overflow. + +> The `hw_codec_adau1860.cpp` `#ifdef`-split if/else chain flagged previously was not found in the current code and is treated as resolved pending final verification. + +--- + +## Architectural Issues + +### 5. PowerManager is still doing a lot + +Even after the refactor, `PowerManager.cpp` (~880 lines) continues to manage charging, fuel-gauge reads, GPIO callbacks, LED signalling, BLE disconnect, reboot logic, battery reporting, and sleep/wake. It is noticeably better organized than before, but the single-file god-object shape remains. A further split into (a) charging manager, (b) battery monitor, and (c) power/state controller would reduce coupling. + +### 6. No Sensor Registry — Hardcoded Sensor Lists + +Confirmed still present at `SensorManager.cpp:88–93`: +```cpp +Baro::sensor.stop(); +IMU::sensor.stop(); +PPG::sensor.stop(); +Temp::sensor.stop(); +BoneConduction::sensor.stop(); +Microphone::sensor.stop(); +``` +Adding a sensor still requires touching multiple files. `sensor_sink` helped on the data-plane side but did not replace the control-plane list. A registry pattern (or a vector of `EdgeMLSensor*`) would eliminate this. + +### 7. Hardcoded GATT Attribute Indices + +Throughout the BLE services: `sensor_service.attrs[4]`, `button_service.attrs[2]`, `sensor_service.attrs[7]`, `parseInfo_service.attrs[5]`. If the `BT_GATT_SERVICE_DEFINE` macro structure changes, these silently break. + +### 8. C / C++ Style Mixing + +The codebase still mixes C and C++ patterns — `memcpy` on C++ objects (`StateIndicator.cpp:~152`), C-style casts, raw pointers with no ownership model, `k_malloc` without RAII. The `Wire` class wraps Zephyr's C I2C API in an Arduino-style C++ interface but leaves some callbacks unimplemented. + +--- + +## Code Quality Issues + +### 9. Magic Numbers + +- **`PowerManager.cpp:~177`** — `0.8 * target_current - 2 * power_manager._battery_settings.i_term` (why 0.8? why 2x?). +- **`PowerManager.h:~64–76`** — battery settings hardcoded, still with German comment `Spannungen [V]`. +- **`BQ27220.cpp:~447–456`** — raw RAM addresses (`0x9240`, `0x9243`, `0x9282`) with no named constants. +- **`DefaultSensors.h`** — `maxBleFrequencyIndex` values (2, 1, 12, 7, 17, 6) with no explanation. +- **`SensorScheme.cpp:100`** — `&parseInfo_service.attrs[5]` for notification attribute. +- **`led.c:21`** — `BLINK_FREQ_MS 1000` used as `K_MSEC(BLINK_FREQ_MS / 2)` without explaining why half. +- **`PPG.cpp:~26–28`** — GPIO pin 6 hardcoded (now in a named static, but still not from device tree). + +### 10. Remaining Dead / Commented-Out Code + +- **`Wire.cpp`** — commented-out `k_mutex_lock/unlock` lines as noted above. +- **`PowerManager.cpp`** — still carries ~70 lines of commented diagnostic/debug code despite recent cleanups. +- **`button_pressed.cpp`** — large block of commented-out multi-button handling. +- **`Button.cpp:80–83`** — `gpio_remove_callback()` commented out, potentially leaving dangling ISR callbacks after `end()`. +- **`battery_service.cpp:~47–48, 141–144`** — commented-out characteristics still present. + +### 11. TODOs in Production Paths + +- **`streamctrl.c:~606–607`** — `"TODO: check if the device wants to pair"`. +- **`PowerManager.cpp`** — multiple remaining `TODO` / `check power on condition` / `check states of load switch` comments. +- **`time_sync.c:~151`** — `can_sync_time()` always returns true with TODO. +- **`uicr.h:12`** — `"TODO: Discuss better alternative for UICR storage"`. +- **`hw_codec_adau1860.cpp:~64`** — `"TODO: make writing to bank work"` with 200ms sleep workaround. +- **`BQ25120a.cpp:~65`** — `"TODO: check value"` for an unjustified 1ms sleep. +- **`SensorManager.cpp:~242`** — `"TODO: if (ble_sensors.empty()) ..."`. + +### 12. Additional Issues + +- **`ParseType.h`** — `parseTypeSizes[]` array still depends on exact enum ordering with no `static_assert`. Adding an enum entry will silently break the mapping. +- **`SensorScheme.cpp:~203–206`** — `strlen()` called multiple times on the same string instead of caching the result. +- **`SensorManager.cpp:~199–202`** — `active_sensors` counter still goes negative under some error paths (symptom of a deeper double-stop bug). +- **`PowerManager.cpp:~356–359`** — `while(!power_on && battery_controller.power_connected())` still has no timeout. +- **`PPG.cpp:~84`** — floating-point comparison without epsilon. +- **`uicr.c:~38–40`** — NVM write verification reads immediately after async write, may see stale value. +- **`uicr.c:~96–100`** — `uicr_hw_revision_get()` takes `char*` with hardcoded `snprintf` size 16, no way for caller to specify buffer size. +- **`SDLogger.h`** — `is_open` is a public bool accessed from multiple files without synchronization; should be private with atomic access. + +--- + +## Resolved Since Last Revision + +- `SensorManager.cpp` double-include of `sensor_service.h` — **fixed**. +- `led_service.h` `AUDIO_PLAYER_H` header guard — **fixed** (now `OPEN_EARABLE_LED_SERVICE_H`). +- `Baro.cpp` commented-out `bmp.start()` — **removed**. +- `BoneConduction.cpp::reset()` "pulse oximeter" copy-paste — **removed**. +- BMX160 suspend mode was missing — **implemented** as part of the BMI160 port. +- `EdgeMLSensor.h` commented-out macro block — **removed** during the sensor_sink refactor. +- `SensorScheme.cpp` inconsistent `-1` / `-ENOMEM` error codes — **normalized** to `-1`. +- `aquire()` misspelling on `MbedI2C` / `TWIM` and all I2C callers — **renamed** to `acquire()`. +- `audio_datapath_aquire` and `SDCardManager::aquire_ls` / `ls_aquired` — **renamed** to `acquire` variants. +- `DefaultSensors.h` `microComponenents` typo — **renamed** to `microComponents`. +- `DefaultSensors.h` microphone channel name casing (`"INNER"` vs `"Outer"`) — **normalized** to uppercase. +- `PowerManager.cpp:365` `abs()` on a float — **replaced** with `fabsf()` (added ``). + +--- + +## What's Done Well + +- **ZBUS adoption** for inter-module messaging remains a good architectural choice and has been extended in the power refactor. +- **sensor_sink** is a nice new seam: sensors no longer need to know about BLE vs SD destinations, which made the BMI160 swap and the audio_datapath removal much cleaner. +- **Device tree integration** for hardware configuration is proper Zephyr practice, and the load-switch binding addition is a good example. +- **Sensor abstraction** via `EdgeMlSensor` base class is a reasonable pattern (though underutilized by the SensorManager control path). +- **Build configuration** split (debug/FOTA/release) is clean. +- **SD card logging** with ring buffers and background flush is a reasonable design; robust mount/unmount handling was added recently. +- **Board definition structure** follows Zephyr conventions well. + +--- + +## Recommended Fix Priority + +1. **Fix the UICR memory collision** — still a data corruption bug in production. +2. **Re-enable Wire mutex locking** — concurrent I2C access can still corrupt transactions (protection is already inconsistent within the same file). +3. **Stop timer before clearing `_active`** in all sensor `stop()` methods — confirmed still backwards in `Baro.cpp` and `IMU.cpp`. +4. **Add atomic/mutex protection** to shared state in sensors, PowerManager, and `time_sync`. +5. **Propagate errors** from I2C reads in BQ25120a/BQ27220 instead of returning stale data. +6. **Replace `sensorSchemesMap[id]` with `.find()`** to prevent silent map entry creation. +7. **Null-check `k_malloc` results** in BQ27220 and fix the VLA on stack. +8. **Free `active_sensor_configs`** in `sensor_service.c` or switch to a static buffer. +9. **Fix the post-facto overflow check in `time_sync.c`**. +10. **Extract magic numbers** into named constants, especially battery parameters and register addresses. +11. **Introduce a sensor registry** to replace the hardcoded stop/start list in `SensorManager.cpp`. +12. **Split PowerManager** further into focused classes with single responsibilities. +13. **Remove remaining dead/commented code** and resolve or delete stale TODOs. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md deleted file mode 100644 index 95398a0c..00000000 --- a/CONTRIBUTING.md +++ /dev/null @@ -1,201 +0,0 @@ -# Contributing - -This repository contains the OpenEarable 2 firmware for the `openearable_v2/nrf5340/cpuapp` target. Contributions should match the current nRF Connect SDK and Zephyr-based build, keep the codebase maintainable, and leave enough documentation for the next contributor to extend the work safely. - -## Core Principles - -- Keep changes small, focused, and easy to review. -- Prefer extending the existing module boundaries over adding new cross-cutting abstractions. -- Preserve a linear Git history by rebasing instead of merging `main` into feature branches. -- Use conventional commits so history stays searchable and automation-friendly. -- Document architecture, public APIs, and non-obvious logic as part of the change. - -## Repository Overview - -The main firmware lives at the repository root and is built through Zephyr and the nRF Connect SDK. - -- `src/audio`, `src/bluetooth`, `src/modules`: runtime audio, Bluetooth, and application modules. -- `src/SensorManager`, `src/Battery`, `src/SD_Card`, `src/time_sync`: sensor, power, storage, and synchronization subsystems. -- `src/drivers`, `src/Wire`, `src/utils`, `src/buttons`, `src/ParseInfo`: reusable device support and shared utilities. -- `boards/`, `dts/`: board overlays and devicetree bindings for the OpenEarable hardware. -- `tools/flash`, `tools/buildprog`, `tools/uart_terminal`: local developer tooling for flashing and diagnostics. -- `.github/workflows/`: CI builds and release automation. - -Before introducing a new directory or abstraction, verify that an existing subsystem is not already the correct extension point. - -## Development Setup - -Use the same toolchain versions the repository expects. - -1. Install Visual Studio Code and the nRF Connect for VS Code extension. -2. Install the J-Link Software and Documentation Package. -3. Install `nrfutil` and ensure it is available on your `PATH`. -4. Install nRF Connect SDK `v3.0.1`. -5. Install toolchain `v3.0.1`. -6. Open this repository as an application in the nRF Connect extension. - -The manifest in [west.yml](west.yml) pins the workspace to `sdk-nrf` `v3.0.1`. Keep documentation and local validation aligned with that version unless the repository is explicitly upgraded. - -## Build And Flash - -For local development, the primary target is `openearable_v2/nrf5340/cpuapp`. - -### Recommended VS Code Build - -- Use the nRF Connect extension to add a build configuration for `openearable_v2/nrf5340/cpuapp`. -- For FOTA builds, set `-DFILE_SUFFIX="fota"` and use a build directory such as `build_fota`. -- For non-FOTA builds, use the standard project configuration without the FOTA suffix. - -### Command-Line Build - -When working from a Zephyr workspace, mirror the CI build: - -```bash -west build --board openearable_v2/nrf5340/cpuapp --pristine=always . -- -DFILE_SUFFIX="fota" -``` - -If you are building from a workspace where this repository is checked out as an application directory, point `west build` at the repository path instead of `.`. - -### Flashing And Recovery - -- Use [tools/flash/flash_fota.sh](tools/flash/flash_fota.sh) to flash a FOTA build with the correct left/right and hardware configuration flags. -- Use [tools/flash/recover.sh](tools/flash/recover.sh) if the board needs a full recover before reflashing. -- Keep the device powered through USB or a sufficiently charged battery during flashing and recovery. - -Update this guide when the build directory names, flashing scripts, board targets, or required tool versions change. - -## Branching And Commit Workflow - -- Create a dedicated branch from the latest `main`. -- Rebase regularly onto `main`. -- Do not merge `main` into your branch. -- When pushing rebased history, use `git push --force-with-lease`. - -Recommended workflow: - -```bash -git checkout main -git pull --rebase origin main -git checkout -b -``` - -Before opening or updating a pull request: - -```bash -git checkout main -git pull --rebase origin main -git checkout -git rebase main -``` - -## Conventional Commits - -All commits must follow the [Conventional Commits](https://www.conventionalcommits.org/) format: - -```text -(): -``` - -Examples: - -```text -feat(sensor-manager): add runtime sampling guard for PPG -fix(flash): validate hardware version before writing UICR -docs(contributing): align contributor guide with Zephyr firmware workflow -refactor(bluetooth): split stream setup from connection state handling -test(ci): add build coverage for release headset configuration -``` - -Allowed types: - -- `feat` -- `fix` -- `refactor` -- `docs` -- `test` -- `chore` -- `build` -- `ci` -- `perf` - -## Code Quality Expectations - -### Architecture - -- Keep module responsibilities explicit and cohesive. -- Avoid mixing hardware access, business logic, and transport logic in the same change unless the behavior truly spans those layers. -- Reuse the existing subsystem layout in `src/` before introducing a new top-level concept. -- Remove dead code and stale indirection when touching a relevant area. -- If a new abstraction is necessary, document why the existing structure is not sufficient. - -### Documentation - -This repository expects code to be documented. - -- Add documentation comments to public classes, public functions, public headers, and reusable module entry points. -- Document parameters, return values, ownership rules, side effects, failure modes, and hardware assumptions when they are not obvious from the signature. -- Add brief intent comments above complex or safety-critical logic blocks where structure alone is insufficient. -- Keep comments synchronized with the implementation. -- Update repository documentation when changing developer workflows, build behavior, repository structure, or subsystem responsibilities. - -### Style - -- Follow the existing naming and file layout conventions. -- Prefer clear control flow over compact but opaque code. -- Avoid unrelated formatting churn. -- Keep headers and source files aligned: declarations, ownership, and invariants should be easy to trace. - -## Validation Before Opening A Pull Request - -At minimum, contributors should validate that the firmware still builds with the repository's supported configuration. - -### Required - -Run a clean FOTA build equivalent to CI: - -```bash -west build --board openearable_v2/nrf5340/cpuapp --pristine=always . -- -DFILE_SUFFIX="fota" -``` - -### Recommended When Relevant - -- Rebuild any additional configuration affected by the change. -- Flash hardware and smoke-test the changed behavior when the work touches sensors, Bluetooth, power management, storage, or audio paths. -- Verify any developer tooling changes with the corresponding script in `tools/`. - -If a change cannot be validated locally, explain the gap in the pull request. - -## Pull Request Guidelines - -- Use a clear title that matches the final change. -- Describe the problem, the chosen solution, and relevant tradeoffs. -- Call out hardware dependencies, risky paths, and follow-up work explicitly. -- Include logs, screenshots, or recordings when they help review tooling or workflow changes. -- Keep each pull request scoped tightly enough for a focused review. - -Before requesting review, confirm that: - -- your branch is rebased onto the latest `main` -- commits follow conventional commit rules -- public APIs and changed behavior are documented -- the relevant firmware build succeeds -- repository documentation is updated where needed - -## What To Avoid - -- Merging `main` into feature branches -- Force-pushing with `--force` -- Bundling unrelated cleanup into functional changes -- Adding undocumented public APIs or hardware assumptions -- Changing build or flash behavior without updating the docs and scripts together -- Opening a pull request without validating the affected configuration - -## Questions And Ambiguity - -When the correct approach is unclear: - -- prefer the simpler design -- document assumptions in the pull request -- ask for clarification before making a large or irreversible change - -Clean history, accurate documentation, and maintainable firmware structure are part of the contribution, not optional follow-up work. diff --git a/POWER_DESCRIPTION.md b/POWER_DESCRIPTION.md new file mode 100644 index 00000000..d16ae92b --- /dev/null +++ b/POWER_DESCRIPTION.md @@ -0,0 +1,506 @@ +# Power Management — OpenEarable v2 + +## Context + +Description of how power management works today, plus a list of still-open +issues. + +Reference reading: +- Zephyr PM: https://docs.zephyrproject.org/latest/services/pm/index.html +- Zephyr Device PM: https://docs.zephyrproject.org/latest/services/pm/device.html +- Zephyr Device Runtime PM: https://docs.zephyrproject.org/latest/services/pm/device_runtime.html + +--- + +## 0. Boot sequence and load-switch lifecycle + +### Hardware power rails (from schematic) + +| Rail | Device | GPIO | Powers | +|------|--------|------|--------| +| **V_LS** (`ls_1_8`) | AP22118CA4-7 | `gpio1.11` | I2C2/I2C3 pull-ups, MX25R6435F flash VCC, SD card SPI level-shifter low side, sensors (1.8 V supply via connector) | +| **LS_LDO** (`ls_3_3`) | BQ25120A internal | `gpio0.14` | KTD2026 LED controller VIN, PPG LDO, sensors (3.3 V supply via connector), audio codec | +| **V_SD** (`ls_sd`) | AP22118CA4-7 | `gpio1.12` | SD card VDD, SD card SPI level-shifter high side | + +**i2c1 pull-ups are on a permanent supply** (not V_LS). This is why +`PowerManager::begin` can talk to BQ25120A / BQ27220 / KTD2026 before any load +switch is up. + +### Which rails each consumer needs + +| Consumer | `ls_1_8` | `ls_3_3` | `ls_sd` | Notes | +|----------|:--------:|:--------:|:-------:|-------| +| Sensors (I2C3: BMA580, BMX160, BMP388, MLX90632) | **yes** | some | — | I2C3 pull-ups on V_LS; MLX90632/BMA580 also need 3.3 V | +| PPG (MAXM86161, I2C2) | **yes** | **yes** | — | I2C2 pull-ups on V_LS; PPG LDO on 3.3 V | +| Audio codec (ADAU1860, I2C2) | **yes** | — | — | I2C2 pull-ups on V_LS; codec enable via separate GPIO | +| LED controller (KTD2026, I2C1) | — | **yes** | — | I2C1 pull-ups on permanent supply; VIN needs 3.3 V | +| SPI NOR flash (MX25R6435F) | **yes** | — | — | VCC on V_LS; DFU only in the app | +| SD card (SDHC on SPI4) | **yes** | — | **yes** | Level-shifter needs V_LS (low) + V_SD (high) | +| BQ25120A / BQ27220 (I2C1) | — | — | — | Permanent supply | + +### Idle profile (as implemented) + +"Device on, BLE advertising, no sensors, no SD logging, no audio, no DFU" plus +a status LED flashing to indicate state: + +- `ls_1_8`: **OFF** (unless an SD card is physically present → ON for level-shifter) +- `ls_3_3`: **ON** while LED is active (KTD2026 owns via `_get`/`_put`) +- `ls_sd`: **OFF** (unless an SD card is physically present → ON) + +### Boot sequence + +``` +T=0 Reset + └→ mcuboot starts + └→ SYS_INIT init_load_switch (PRE_KERNEL_2, prio 80) + ├→ gpio1.11 = HIGH (ls_1_8 ON — needed for SPI NOR flash) + └→ gpio0.14 = HIGH (ls_3_3 ON — needed for status LED) + └→ mcuboot reads/verifies image, blinks LED + └→ mcuboot jumps to app (GPIO state preserved: ls_1_8 HIGH, ls_3_3 HIGH) + +T=? Application kernel init (mcuboot is gone; no reset; GPIOs intact) + └→ POST_KERNEL prio 80: board_init.c device init + ├→ init_pm_device(ls_1_8): gpio → INACTIVE (HIGH→LOW transient) + ├→ init_pm_device(ls_3_3): gpio → INACTIVE (HIGH→LOW transient) + └→ init_pm_device(ls_sd): gpio → INACTIVE (was already off) + Framework state: all three SUSPENDED, refcount 0 + └→ spi_nor driver init (mx25r6435f) + pm_device_driver_init checks pm_device_is_powered(dev): + - power-domains = <&load_switch> → parent is SUSPENDED + - pm_device_is_powered returns FALSE + → pm_device_init_off(dev); return 0; + NO SPI transactions. NO infinite-loop hang. + └→ sdhc_spi driver init (sdhc0) + Only checks device_is_ready(spi_dev). No SPI I/O. No hang. + +T=? main() → power_manager.begin() + ├→ Talks to BQ25120A/BQ27220 on i2c1 (permanent supply — no load switch) + ├→ Reads reset reason, logs RESETREAS + BQ25120A fault / BQ27220 status + ├→ Claims ZERO load switches + ├→ check_battery() — the ONLY gate on booting + │ └→ fail: return power_down() (rails stay off, sys_poweroff) + ├→ power_on = true, state_indicator.init → KTD2026::begin + │ └→ _get(ls_3_3) → RESUME → gpio HIGH → LED on + ├→ Starts power_button_watch_work (see §6) + └→ main() continues: + ├→ sdcard_manager.init() → acquires ls_1_8 + ls_sd briefly, probes + │ sd_state pin (card-detect needs rails up on this board), keeps + │ rails if card present, releases otherwise + ├→ disk_access_init("SD") — SD disk initialised while rails are up + ├→ usbd_enable — USB MSC LUN points at "SD" + ├→ Sensors started later (BLE client configures) + │ └→ sensor.init → _get(ls_1_8) [+ _get(ls_3_3) for some] + ├→ Audio started later (streaming begins) + │ └→ dac.begin → _get(ls_1_8) + └→ DFU (MCUmgr upload over BLE) + └→ StateIndicator DFU hook: MGMT_EVT_OP_IMG_MGMT_DFU_STARTED + → _get(mx25r64) → cascades via power-domains to _get(ls_1_8) + → TURN_ON: spi_nor_configure (JEDEC ID, SFDP, mxicy config) + → RESUME: exit DPD → flash ready + └→ MGMT_EVT_OP_IMG_MGMT_DFU_STOPPED + → _put(mx25r64) → SUSPEND (enter DPD) + → cascades _put(ls_1_8) → if refcount=0, SUSPEND → gpio LOW +``` + +### Key configuration + +- **DTS** (`boards/openearable_v2_nrf5340_cpuapp.overlay`, + `.../openearable_v2_nrf5340_cpuapp_common.dts`): + - `mx25r64` has `power-domains = <&load_switch>` + `zephyr,pm-device-runtime-auto`. + - All three load-switch nodes carry `zephyr,pm-device-runtime-auto`. + - The repo-local load-switch binding at + `boards/teco/openearable_v2/dts/bindings/load-switch.yaml` declares + `#power-domain-cells = <0>` so other devices can use it as their power domain. +- **Kconfig** (`prj.conf`): `CONFIG_PM_DEVICE_POWER_DOMAIN=y`. +- **`KTD2026.cpp`**: claims only `ls_3_3`. +- **`PowerManager::begin`**: claims no load switches. `check_battery()` is the + only boot gate (see §2); reset reason is logged but not gating. +- **`SDCardManager::init`**: presence probe — briefly acquires `ls_1_8` + `ls_sd`, + waits 1 ms, checks `sd_state` pin, keeps rails if a card is present, releases + otherwise. Card-detect can't read the card unless rails are up (project memory: + `project_sd_detect_needs_rails`). `acquire_ls` / `release_ls` only manage + `ls_1_8` + `ls_sd`. +- **`main.cpp`**: calls `sdcard_manager.init()` before `disk_access_init("SD")` + so the SD disk probe sees an already-powered card. +- **MCUmgr DFU hook** (`StateIndicator.cpp`): `MGMT_EVT_OP_IMG_MGMT_DFU_STARTED` + calls `pm_device_runtime_get(mx25r64_dev)` and DFU_STOPPED calls the matching + `_put`, cascading through power-domains to `ls_1_8`. + +### Why the boot doesn't hang on SPI NOR + +The Zephyr `spi_nor` driver's `pm_device_driver_init` checks +`pm_device_is_powered(dev)`: with `CONFIG_PM_DEVICE_POWER_DOMAIN=y` and a +`power-domains` parent that's SUSPENDED, it returns false → `pm_device_init_off` +short-circuits the init before any SPI transaction. Without the power-domain +linkage the driver would read 0xFF from the unpowered chip and spin forever in +`spi_nor_wait_until_ready` (unbounded `while (true)` in `spi_nor.c:479` +because the WIP bit looks set in garbage). + +--- + +## 1. Zephyr PM background (one-paragraph refresher) + +Zephyr separates **System PM** (CPU sleep states, set by a policy callback during the +idle thread) from **Device PM** (per-driver action callbacks: `TURN_ON`, `RESUME`, +`SUSPEND`, `TURN_OFF`). Device Runtime PM (`CONFIG_PM_DEVICE_RUNTIME`) layers a +reference counter on top: drivers call `pm_device_runtime_get()` before using a device +and `pm_device_runtime_put()` after, and the framework calls the action callback to +flip ACTIVE↔SUSPENDED automatically. Devices can be tied together via the +`power-domains` DT property, so getting a child also brings up its supply, and the +`zephyr,pm-device-runtime-auto` DT property makes the framework enable runtime PM +without an explicit `pm_device_runtime_enable()` in code. + +--- + +## 2. What OpenEarable v2 actually does + +**Configuration** (`prj.conf:125-128`): +``` +CONFIG_PM=y +CONFIG_PM_DEVICE=y +CONFIG_PM_DEVICE_RUNTIME=y +CONFIG_POWEROFF=y +``` +System PM is *enabled* but no PM policy hooks or sleep states are exercised — the +application never participates in system suspend. The MCU only ever runs at full +clock or fully off (`sys_poweroff()`). + +**Architecture in three layers:** + +1. **Application policy — `PowerManager` (`src/Battery/PowerManager.{h,cpp}`)** + - Custom 10-state battery/charging state machine fed by BQ27220 (fuel gauge) + + BQ25120A (charger) over I²C1, driven by two work items + (`charge_ctrl_delayable`, `fuel_gauge_work`) and three GPIO callbacks + (`power_good_callback`, `fuel_gauge_callback`, `battery_controller_callback`). + Classification is factored into a pure `classify_charging()` helper (§5). + - Owns the boot/power-on/power-off sequence: `begin()` and `power_down()`. + - Publishes battery state on the `battery_chan` ZBUS channel. + +2. **Power gating — three custom load-switch "devices"** + `boards/teco/openearable_v2/board_init.c` defines three `DEVICE_DT_DEFINE`s + (`ls_1_8`, `ls_3_3`, `ls_sd`) using a generic PM control callback that just + toggles a GPIO and waits `power-delay-us`: + ```c + case PM_DEVICE_ACTION_SUSPEND: gpio_pin_set_dt(&data->ctrl_pin, 0); break; + case PM_DEVICE_ACTION_RESUME : gpio_pin_set_dt(&data->ctrl_pin, 1); + k_usleep(data->delay_us); break; + ``` + The load switches use `pm_device_runtime_*` for refcounting. `ls_3_3` is the + 3.3 V LDO inside the BQ25120A (DT child of `bq25120a@6a`); `ls_1_8` and `ls_sd` + are GPIO load switches on `gpio1.11` / `gpio1.12`. All three have + `zephyr,pm-device-runtime-auto` so runtime PM is enabled automatically and + `PowerManager::begin()` doesn't have to touch them — each rail comes up on + the first `_get` and drops on the last `_put`. + +3. **Application-level sensor/peripheral wrappers** + Every sensor driver (`IMU.cpp`, `Baro.cpp`, `BoneConduction.cpp`, `PPG.cpp`, + `Temp.cpp`), the LED driver (`KTD2026.cpp`), the audio codec (`ADAU1860.cpp`), + and the SD card manager (`SD_Card_Manager.cpp`) call + `pm_device_runtime_get(ls_*)` in `init()`/`begin()` and + `pm_device_runtime_put(ls_*)` in `stop()`/`power_off()`. None of the sensors + themselves are real Zephyr devices — they're declared as + `compatible = "i2c-device"` and accessed through C++ wrappers, so they have no + PM action callbacks of their own. + +**Power-down sequence (`PowerManager::power_down`):** + +`reboot()` and `power_down()` share a `shutdown_subsystems()` helper that: +disconnects BLE peers, stops external advertising, stops the sensor manager, +stops the BT watchdog, and ends the DAC. From there: + +1. `shutdown_subsystems()` (shared with `reboot()`) +2. `led_controller.power_off()` +3. If not charging: arm BQ25120A PG as the System-OFF wake source, high-impedance the charger +4. `k_msleep(200)` to let BT disconnects propagate, then `bt_disable()` (on nRF5340 + this also forces the netcore off via `bt_hci_transport_teardown`) +5. Clear error LED +6. If charging: `sys_reboot(COLD)` and return +7. Otherwise: disable BQ25120A `EN_LS_LDO`, then `pm_device_action_run(SUSPEND)` on + `ls_sd`, `ls_3_3`, `ls_1_8`, and `cons` (the UART console) +8. `poweroff audit` log line (rail pins, `EN_LS_LDO`, `pmic_cd`, `netcore_off`) +9. `sys_poweroff()`; fallback `k_msleep(1000); sys_reboot(COLD)` + +**Sensor pattern (typical):** +```cpp +bool Sensor::init() { + pm_device_runtime_get(ls_1_8); // and ls_3_3 if needed + if (!hw.begin()) { pm_device_runtime_put(ls_1_8); return false; } + ... +} +void Sensor::stop() { + if (!_active) return; + _active = false; _running = false; + k_timer_stop(...); k_work_cancel(...); + hw.softReset()/stop()/sleepMode(); // varies per sensor; all chips are + // driven into a sleep/suspend state + // before the rail is released + pm_device_runtime_put(ls_1_8); +} +``` + +--- + +## 3. Open issues + +### High + +#### 3.1 No mid-power "BLE advertising only" state +During normal "idle" operation (advertising or connected) the BLE controller +(network core + RF) is the dominant power consumer. There is no +advertising-only / sensors-off mid-power state — the device is "everything on" +or "off". + +#### 3.2 No system PM is actually used +`CONFIG_PM=y` is set but the application never enters a low-power sleep state. +Zephyr's tickless idle reduces wakeups, but the SoC stays in CONSTLAT, the HF clock is +likely running, and the I²C peripheral blocks (see 3.3) are powered. There is no PM +policy callback, no `pm_state_force()`, no constraint API usage. The "low power" path +is jump-straight-to-`sys_poweroff()`. + +#### 3.3 I²C buses are never gated +`i2c1`, `i2c2`, `i2c3` all have `status = "okay"` and define both `default` and +`sleep` pinctrl states (`*.dts:95-183`). But nothing ever drives the bus into the +sleep state — `nordic,nrf-twim` only flips pinctrl when its own PM action callback +runs, and nobody calls `pm_device_action_run` on the I²C controllers. So the TWIM +peripheral blocks are clocked continuously. + +#### 3.4 No `power-domains` linkage between sensors and load switches +Sensor DT nodes (`bmp388@76`, `bma580@18`, `bmx160@68`, `mlx90632@3a`, +`maxm86161@62`) declare no `power-domains` property. Combined with the fact that +they're `compatible = "i2c-device"` and have no driver/PM callback, the load-switch +refcount and the sensor's "active" state are coordinated only by the C++ wrappers. +Easy to leak and easy to introduce ordering bugs. + +### Medium + +#### 3.5 `power_down` ordering: sensors are stopped before BLE is disconnected +`shutdown_subsystems()` runs disconnect → ext-adv-stop → +`stop_sensor_manager()` → stop-watchdog → `dac.end()` without waiting for the +async disconnect events. The 200 ms sleep before `bt_disable()` is the +existing buffer; re-ordering so audio/sensor teardown happens after BLE +teardown is a latent improvement. + +#### 3.6 `DEBOUNCE_POWER_MS = K_MSEC(1000)` is unused at the place that needs it +`PowerManager.h` defines it, but `power_good_callback` schedules +`power_down_work` with `K_NO_WAIT`. So unplugging USB while powered-off triggers +an immediate `power_down`, with no debounce. Not catastrophic but the named +constant is misleading. + +#### 3.7 No fault-recovery path for non-undervoltage faults +In `classify_charging`, only BAT_UVLO (bit 5) has a recovery transition (→ +PRECHARGING when power is connected and current is flowing). OVP / TS / input-UV +faults fall through to `FAULT` and re-enter it on the next poll with no exit. +The work handler does re-run `setup_pmic()` on a TS fault, which might un-stick +the TS path, but everything else requires a user power-cycle. + +### Low / code-quality + +#### 3.8 Synchronous `pm_device_runtime_put` everywhere +Some shutdown paths (especially PPG, which talks to the chip) could use +`pm_device_runtime_put_async` so the suspend completes off the calling thread. +Probably doesn't matter for the rare power-down case but might smooth sensor +reconfiguration. + +#### 3.9 Sensors aren't real Zephyr devices +Compatible = `"i2c-device"` means: no `init_fn`, no `pm_action_cb`, no +`PM_DEVICE_DT_INST_DEFINE`. We're paying the price (manual coordination, no +`power-domains`, no auto-runtime, can't piggy-back on system PM) without the +benefit (smaller code). This is a structural choice — converting to real +drivers is a larger refactor — but it's the root cause of 3.4, 3.8, and would +simplify most of the manual wrapper refcounting. + +--- + +## 4. Next steps + +- **Root-cause USB MSC mid-run failure** — the `reboot()` in §7 is a pragmatic + fix; the underlying race between running system state and USB MSC attaching + to the SD disk is not understood (see §8). +- **Consider converting sensors to real Zephyr drivers** with PM action + callbacks and `power-domains` (§3.9). Big refactor; would eliminate several + categories of manual refcount bugs. +- **Gate the I²C controllers** (§3.3) when no sensor/LED/codec is active. +- **Add a BLE-only idle state** (§3.1) to cut average draw while advertising. + +--- + +## 5. Charging code: structure + +The charging-related code lives in `src/Battery/PowerManager.{h,cpp}` and +`src/Battery/BQ25120a.{h,cpp}`. A few patterns are load-bearing; grepping for +these names will orient most changes. + +### `BQ25120a::ChargePhase` — typed enum for the 2-bit charging-phase field + +`enum class ChargePhase : uint8_t { Discharge, Charging, Done, Fault }`. The +register-0x00 `>> 6` shift lives in a single accessor, +`BQ25120a::read_charge_phase()`. Everything that cares about phase (the work +handler's big switch, `get_battery_status` GATT encoding, `cmd_battery_info`) +uses the enum. One diagnostic (`cmd_sensor_diag`) still prints the raw byte +inline — deliberate, because it also dumps the full register for debugging. + +### `BQ25120a::ActiveScope` — internal RAII guard for I2C access + +I2C reads/writes to the BQ25120A require the chip to be out of high-impedance +mode (CD pin low) while the transaction happens. `ActiveScope` is a private, +refcounted RAII guard with a `k_mutex`: the 0→1 transition calls +`exit_high_impedance()`, the 1→0 transition calls `enter_high_impedance()`, and +nested/concurrent scopes compose correctly. + +**Every public I2C method self-wraps in an `ActiveScope`.** Callers just call +`battery_controller.read_charge_phase()` and the hi-Z dance happens inside. +Refcounting means a public method that calls another public method +(`setup()` → the various `write_*` helpers) only toggles the CD pin on the +outermost entry. `enter_high_impedance()` / `exit_high_impedance()` are also +private; `ActiveScope` is the only thing that calls them. + +The single exception is `enter_ship_mode()`, which drives CD high directly as +part of the fire-and-die ship-mode entry sequence (§9.3.1.1 of the datasheet) — +the chip is going to cut SYS in a few ms anyway, so there's nothing to restore. + +### `charger_init_pending` — ISR → work-queue handoff for charger re-init + +`power_good_callback` runs in GPIO ISR context on USB plug-in/plug-out. I2C can't +run there, so it can't call `setup_pmic()` directly. Instead, on plug-in it sets +`charger_init_pending = true` and schedules the `charge_ctrl_delayable` work +item. `charge_task` (work context) sees the flag, clears it, runs `setup_pmic()` ++ `enable_charge()`, then submits `fuel_gauge_work`. Boot doesn't need to seed +the flag — `begin()` calls `setup_pmic()` once up front. + +### `PowerManager::setup_pmic()` — single entry point for charger configuration + +All charger-configure paths (`begin()`, `charge_task()` on plug-in, +`fuel_gauge_work_handler` on TS-fault recovery, the `sensor_diag` shell command) +route through `setup_pmic()`. `_battery_settings` is referenced in exactly one +place outside the member declaration. `BQ25120a::setup()` self-wraps in +`ActiveScope`, so `setup_pmic()` just calls it plainly. + +### `BQ25120a::fault_bits[]` — single source of truth for fault-register labels + +A constexpr array of `{mask, name}` pairs for register 0x01 (faults). The work +handler's `LOG_WRN` loop and the shell diag's `shell_print` loop both iterate +this array. Labels follow BQ25120A datasheet Table 13 exactly: +B4=BAT_OCP (cleared on read), B5=BAT_UVLO (persistent), B6=VIN_UV (cleared on +read), B7=VIN_OV (persistent). Heads-up: upstream commit `91d4081` swapped the +B4/B7 names in 2025-05; the swap is fixed here but still lives in upstream. + +### `classify_charging()` — pure state classifier + +`fuel_gauge_work_handler` separates three concerns: + +1. **Read** hardware state into `struct charging_snapshot` (phase, `bat_status`, + `gauge_status`, fault byte, voltage, current, target current, `power_connected`). +2. **Classify** via file-static pure `classify_charging(snapshot, cfg) → enum + charging_state`. Zero I/O, no logging, no side effects — unit-testable in + isolation (no tests written yet). +3. **Side effects** on the result: logging by phase, TS-fault recovery + (`setup_pmic()`), zbus publish, polling-interval adjustment. + +The undervoltage-recovery edge case (BAT_UVLO + power connected + current +flowing → PRECHARGING) is a single branch inside the classifier rather than a +side-effecting hairball in the switch. + +### `cmd_battery_info` vs. work-handler LOG_DBG dump + +Both print overlapping battery snapshots in slightly different formats. Not +consolidated; a shared formatter taking a `printk`/`shell_print` callback is the +natural next step if fields need to be added. `cmd_battery_info` also prints +the four load-switch pin states (`ls_1_8`, `ls_3_3`, `ls_sd`, PPG LDO) plus +the BQ25120A `EN_LS_LDO` bit. + +--- + +## 6. Power-button state machine + +`PowerManager::begin()` no longer gates boot on BQ25120A button/wake register +bits. The only boot gate is `check_battery()`. The button state machine is a +post-boot polling loop: + +``` +member: first_release_seen = false // set once the button is first released + +begin() schedules power_button_watch_work with K_MSEC(100) +power_button_watch_handler (k_work_delayable): + if earable_btn.getState() == BUTTON_RELEASED: + first_release_seen = true // consume the power-on press + return // stops polling + else: + reschedule(K_MSEC(100)) + +battery_controller_work_handler (BQ25120A INT → work): + read button register + if state.wake_2 && first_release_seen: + power_on = !power_on + if (!power_on) power_down() +``` + +Result: the user can hold the button until they see the desired state change, +release, and that's it. The toggle on WAKE_2 fires immediately (state change is +visible while the button is still held); the `first_release_seen` flag makes +sure the initial power-on press isn't mis-read as an immediate power-off +toggle. + +--- + +## 7. Reset-reason handling and USB-plug reboot + +`begin()` reads `RESETREAS` for **diagnostics only** — it logs the bits and +records `oe_boot_state.timer_reset` on `RESETPIN` wakes (the BQ25120A timer +reset vs a programmer nRESET is useful downstream) — but the reset reason +does not gate boot. + +USB-plug while the device is already running is handled by triggering a +graceful reboot instead of trying to bring USB MSC up against running app +state: + +```cpp +// power_good_callback (GPIO ISR on BQ25120A PG): +if (power_good && power_manager.power_on) { + k_work_submit(&usb_plug_reboot_work); // handler calls power_manager.reboot() +} +``` + +This ensures the device always comes up via the cold-boot-with-USB path, which +is known to cleanly enumerate the SD card over MSC. On VBUS-wake from +System OFF, the new boot just proceeds normally (no special handling needed). + +--- + +## 8. Known limitation: USB MSC while device is running + +`sd_bench` (firmware-side disk access) works reliably with the rails up, but +host-initiated READ(10) requests over USB MSC time out with `DID_ERROR +cmd_age=3s` when USB is plugged into a running device. INQUIRY / READ_CAPACITY +(served from cached `sd_card` fields, no SPI transaction) respond fine; the +failure is specifically on data reads. Root cause not nailed down — suspected +thread/priority contention between the USBD stack and whatever the app is +doing when the host tries to read. Worked around by rebooting on USB plug (§7), +which puts us into the cold-boot path that works end-to-end. + +--- + +## 9. Files referenced + +| File | Notes | +|------|-------| +| `src/Battery/PowerManager.h` | Class definition; power-button / USB-plug work items; `first_release_seen` flag | +| `src/Battery/PowerManager.cpp` | `begin`, `power_down`/`reboot` sharing `shutdown_subsystems`, `power_button_watch_handler`, `usb_plug_reboot_handler`, fault-log with CTRL/FAULT/TS_FAULT raw bytes | +| `src/Battery/BQ25120a.{cpp,h}` | Charger; HiZ + `ActiveScope`, `ChargePhase`, `fault_bits`. Push-button Control register (0x08) is left at reset defaults (MRRESET=9s, MRWAKE2=1500ms) — firmware never writes it. | +| `src/Battery/BQ27220.{cpp,h}` | Fuel gauge; wakeup interrupts | +| `boards/teco/openearable_v2/board_init.c` | Custom load-switch PM devices | +| `boards/teco/openearable_v2/openearable_v2_nrf5340_cpuapp_common.dts` | I²C/load-switch nodes; all three load switches carry `zephyr,pm-device-runtime-auto` | +| `boards/openearable_v2_nrf5340_cpuapp.overlay` | `mx25r64` carries `power-domains = <&load_switch>` + `zephyr,pm-device-runtime-auto` | +| `boards/teco/openearable_v2/dts/bindings/load-switch.yaml` | Repo-local load-switch binding; `#power-domain-cells = <0>` | +| `src/SensorManager/IMU.cpp` | `imu.stop()` parks accel+gyro in BMI160 suspend mode before `_put(ls_1_8)` | +| `src/SensorManager/Baro.cpp` | `bmp.sleep()` before pm_device_runtime_put | +| `src/SensorManager/BoneConduction.cpp` | OK; calls bma580.stop() | +| `src/SensorManager/PPG.cpp` | GPIO LDO released in `stop()` and error path | +| `src/SensorManager/Temp.cpp` | OK; calls sleepMode() | +| `src/SensorManager/SensorManager.cpp` | `stop_sensor_manager` calls every `.stop()` | +| `src/drivers/LED_Controller/KTD2026.cpp` | claims only `ls_3_3` | +| `src/drivers/ADAU1860.cpp` | Audio codec PM | +| `src/SD_Card/SD_Card_Manager/SD_Card_Manager.cpp` | Presence probe in `init()`; `acquire_ls`/`release_ls` manage only `ls_1_8` + `ls_sd` | +| `src/main.cpp` | `sdcard_manager.init()` before `disk_access_init("SD")` | +| `src/utils/StateIndicator.cpp` | MCUmgr DFU hook: `get`/`put` on `mx25r64` | +| `prj.conf` | CONFIG_PM*, CONFIG_PM_DEVICE_POWER_DOMAIN, CONFIG_POWEROFF | +| `SYSTEM_DESCRIPTION.md` | I²C topology, sensor/codec overview | diff --git a/README.md b/README.md index 983db6ed..dece0bb1 100644 --- a/README.md +++ b/README.md @@ -9,23 +9,24 @@ 1. [Setup](#setup) -2. [Contributing](#contributing) +2. [Battery States](#battery-states) -3. [Battery States](#battery-states) +3. [Connection States](#connection-states) -4. [Connection States](#connection-states) +4. [SD Card](#sd-card) -5. [SD Card](#sd-card) +5. [Citing](#citing) -6. [Citing](#citing) +**NOTE** - The OpenEarable 2.0 has a known issue where the flex cable to the sensors can come loose, causing the sensors to stop working. If this happens, you can try to fix it by reseating the flex cable. ## Setup 1. **Install Visual Studio Code (VS Code)** - Download and install from [https://code.visualstudio.com](https://code.visualstudio.com). -2. **Install the J‑Link Software and Documentation Package** +2. **[OPTIONAL: JLINK FLASHING] Install the J‑Link Software and Documentation Package** - Download and install from [https://www.segger.com/downloads/jlink/](https://www.segger.com/downloads/jlink/). + - NOTE: install the version of JLink that is compatible with nRF Connect SDK 3.0.1 -- currently JLink 9.24a. 3. **Install nRF-Util** - Download from [nRF Util – Nordic Semiconductor](https://www.nordicsemi.com/Products/Development-tools/nRF-Util). @@ -57,15 +58,10 @@ - Select the `open-earable-2` application. - Click **"+ Add build configuration"** to set up a new build. - Select the SDK version 3.0.1, toolchain version 3.0.1, and `open-earable-2/nrf5340/cpuapp` as board target. - - To build **with FOTA** (firmware over-the-air update functionality): - - Leave the `Base configuration files (Kconfig fragments)` dropdown empty. - - as `Extra CMAKE arguments` set `-DFILE_SUFFIX="fota"`. - - as `Build directory` name set `build_fota`. - - To build **without FOTA**: - - Select `prj.conf` as the `Base configuration files (Kconfig fragments)`. - - Do not set any of the FOTA flags described above. + - Leave the `Base configuration files (Kconfig fragments)` dropdown empty. + - The default build includes FOTA (firmware over-the-air update) support. -9. **J-Link Setup** +9. **OPTIONAL: J-Link Setup** - Wire your J-Link to the debugging breakout PCB as shown below. ![image](https://github.com/user-attachments/assets/2eeec41e-6be1-4a4f-b986-7d9a07b0f8e5) - If you do not own a J-Link yet, here are a few options (do **NOT** use J-Link clones, they will not work and are illegal!): @@ -76,22 +72,42 @@ 11. **Build and Flash** - Click on `Generate and Build` and wait for the application to build (this will take some time) - Make sure your device is charged or powered via USB. If the battery is fully discharged, the charging management IC will no longer supply power to the MCU from the battery, so you won’t be able to flash the MCU unless the battery is charged or the device is directly powered via USB. - - Open a new terminal in VS Code and run the following command from the root of the `open-earable-v2` directory to flash the FOTA build. Make sure to set the serial number of your J-Link (right click your J-Link in the `CONNECTED DEVICES` tab of the nRF connect extension and copy the serial number). + + **[JLINK FLASHING]** + - Open a new terminal in VS Code and run the following command from the root of the `open-earable-v2` directory to flash. Make sure to set the serial number of your J-Link (right click your J-Link in the `CONNECTED DEVICES` tab of the nRF connect extension and copy the serial number). ```bash # --right for the right ear device, or no flag to retain left/right bonding, --standalone for no pair # --hw version is optional and can only be used with --left or --right - ./tools/flash/flash_fota.sh --snr 123456789 --left --hw 2.0.1 + ./tools/flash/flash.sh --snr 123456789 --left --hw 2.0.1 ``` - - - or without FOTA + + - The flash script is also available for Windows as `./tools/flash/flash.ps1`. To execute it, open PowerShell with administrative privileges. + + **[FOTA FLASHING via the Phone App]** + - Charge to ~80% or more, unplug the earbud + - Copy build/dfu_application.zip to your phone (either plug your phone is and transfer via USB, or upload it to Google Drive, or however) + - Open the OpenEarable app on your phone + - Connect to the device, and click the update button next to the firmware + - Click the "+" button to add a custom firmware + - Select the dfu_application.zip file + - Click through to flash the firmware + - (wait for the little red light *inside* the earbud to stop flashing) + + **[SERIAL FLASHING via USB]** + - MCUboot is enabled by default. Install prerequisites: ```bash - # --right for the right ear device, or no flag to retain left/right bonding, --standalone for no pair - # --hw version is optional and can only be used with --left or --right - - ./tools/flash/flash.sh --snr 123456789 --left + nrfutil install mcu-manager ``` - - - The FOTA update script is also available for Windows as `./tools/flash/flash_fota.ps1`. To execute it, open PowerShell with administrative privileges. + - Power off the device + - Remove any SD card (the SD card conflicts with the USB serial port!) + - Power on the device + - Plug in the device via USB, verify that you see the serial port appear (for example /dev/ttyACM0) + - Use the mcu-manager_upload.sh script, which uploads both app and network core images, marks them for testing, and resets the device: + ```bash + ./tools/flash/mcu-manager_upload.sh + ``` + - You may need to edit the serial port in the script (default: `/dev/ttyACM0`). + 11. **Recover Board** - If the application or network core becomes unresponsive, or you encounter flashing issues, you can recover the board using the recovery script. The `--snr` parameter specifies the serial number of your J-Link debugger. @@ -126,12 +142,35 @@ ``` - After successful recovery, you can attempt to flash the firmware again (you will have to restore left/right bonding and hardware version). +## Mounting the SD Card over USB-C +Connect the device to USB-C, and then press the reset button to power-cycle the device. When it comes up, it should mount! +Note: The SD card is automatically unmounted from USB when the firmware starts logging (e.g. `sensor stress sd`), and re-mounted when logging stops. -## Contributing -Contributor workflow, validation steps, code documentation expectations, and repository-specific Git guidance are defined in [CONTRIBUTING.md](CONTRIBUTING.md). +## RTT Shell +To access the Zephyr shell over RTT (e.g. for running `sensor` commands), use J-Link with netcat: -If you change build behavior, flashing scripts, repository structure, or public firmware APIs, update that guide in the same change so the contributor documentation stays aligned with the repository. +**Terminal 1** — start J-Link: +```bash +JLinkExe -device nrf5340_xxaa_app -if swd -speed 4000 -autoconnect 1 +``` + +**Terminal 2** — connect to RTT: +```bash +JLinkRTTClient -LocalEcho Off +``` + +Note: You must stop `JLinkExe` (Ctrl-C) before flashing! + + +## Error LED (Internal Red LED) +There is a separate red LED connected to the `#ERROR` pin (GPIO1:8) on the MDBT board, distinct from the main RGB status LED. It is defined as `led_error` in the devicetree. + +| LED State | Description | +|------------------|-----------------------------------------------------------------------------| +| Blinking | MCUboot firmware upgrade in progress | +| Solid on | MCUboot found no bootable image, or the app hit a fatal error | +| Off | Normal operation (valid image booted successfully) | ## Battery States Battery states will overwrite LED connection states. All LED states can be manually overwritten via BLE service. @@ -140,7 +179,7 @@ Battery states will overwrite LED connection states. All LED states can be manua | LED State | Description | |------------------|-----------------------------------------------------------------------------| -| 🟥 Red - Solid | > 20 seconds = battery fault or deep discharge* | +| 🟥 Red - Solid | Battery fault or deep discharge*, charging current = 0 | | 🔴 Red - Pulsing | Pre-charge phase or system-down voltage not yet cleared | | 🟧 Orange - Solid | Power connected, but charging current is not verified or not at desired level | | 🟠 Orange - Pulsing | At least 80% of the target charging current is reached | @@ -191,8 +230,4 @@ If you are using OpenEarable, please cite is as follows: pages = {1--33}, publisher={ACM New York, NY, USA} } -``` - - - - +``` \ No newline at end of file diff --git a/SYSTEM_DESCRIPTION.md b/SYSTEM_DESCRIPTION.md new file mode 100644 index 00000000..1709780f --- /dev/null +++ b/SYSTEM_DESCRIPTION.md @@ -0,0 +1,85 @@ +# OpenEarable v2 Firmware — System Description + +This is a **Zephyr RTOS** firmware project for the **nRF5340** dual-core SoC, built with the **nRF Connect SDK (v3.0.1)** and CMake. It's an open-source ear-worn sensing platform with BLE LE Audio, multiple sensors, and SD card logging. + +## Top-Level Layout + +| Path | Purpose | +|------|---------| +| `src/` | Main source code (~700 files) | +| `src/main.cpp` | **Application entry point** — initializes power, USB, audio, sensors, BLE services | +| `boards/teco/openearable_v2/` | Board definitions, device trees, pin configs | +| `dts/bindings/` | Custom device tree bindings (fuel gauge, codec, etc.) | +| `include/` | Shared headers (notably `zbus_common.h` for the message bus) | +| `tools/` | Flash scripts, UART terminal utilities | +| `doc/` | RST documentation (building, FOTA, architecture) | + +## Key Source Modules (`src/`) + +- **`audio/`** — LE Audio streaming pipeline: I2S, PDM mic, LC3 codec, audio datapath, equalization, SD card playback +- **`bluetooth/`** — BLE stack: unicast/broadcast streams, GATT services (sensor, battery, LED, button), volume control, advertising, DFU +- **`SensorManager/`** — Hardware sensor abstraction for 5 sensors: BMA580 (accel), BMX160 (IMU), BMP388 (baro/temp), MAXM86161 (PPG), MLX90632 (IR thermometer) +- **`Battery/`** — Power management with TI BQ25120A (charger) and BQ27220 (fuel gauge) drivers +- **`SD_Card/`** — FAT/exFAT filesystem, high-speed logging in `.oe` binary format +- **`drivers/`** — Hardware drivers: Cirrus ADAU1860 codec, I2S, USB audio, LED controller, DSP filters +- **`Wire/`** — Arduino-like I2C/TWI abstraction +- **`buttons/`** — Button input state machine +- **`time_sync/`** — Multi-device time synchronization +- **`ParseInfo/`** — Dynamic sensor configuration schemas +- **`utils/`** — LED state indicator, UICR access, board version detection + +## Inter-Module Communication + +Most modules are decoupled via **Zephyr ZBUS** — a publish/subscribe message bus. Channels include `button_chan` (`button_msg`), `le_audio_chan` (`le_audio_msg`), `battery_chan` (`battery_data`), `volume_chan` (`volume_msg`), `sd_card_chan` (`sd_msg`), and others. + +Sensor data bypasses ZBUS for throughput: SensorManager modules write `sensor_msg` structs directly via `sensor_sink_put()`, which fans out to the SD logger and the BLE sensor-service GATT queue. + +## Configuration Files + +- **`prj.conf`** — Default build with full logging, BLE, sensors, MCUboot FOTA support +- **`prj_release.conf`** — Production build (no debug, minimal logging) +- **`Kconfig` / `Kconfig.defaults`** — Kernel-style config system +- **`*.overlay`** files — Device tree overlays per build variant + +## Data Flow + +- **Audio:** BLE LE Audio ISO → LC3 decode → audio datapath → I2S → ADAU1860 codec (and reverse for mic capture) +- **Sensors:** I2C hardware → SensorManager → sensor_sink → BLE GATT notifications + SD card logging +- **Power:** BQ25120A charger → BQ27220 fuel gauge → PowerManager → ZBUS → LED status + BLE notifications + +## Build & Flash + +Built with `west build` (Zephyr's meta-tool). Flash scripts in `tools/flash/` support J-Link, FOTA, and MCU Manager upload. The `west.yml` manifest pins the nRF Connect SDK version. + +## Hardware + +- **SoC:** nRF5340 dual-core ARM Cortex-M33 (Application + Network cores) +- **Audio Codec:** Analog Devices ADAU1860 +- **Sensors:** BMA580, BMX160, BMP388, MAXM86161, MLX90632 +- **Battery:** TI BQ25120A (charger) + BQ27220 (fuel gauge) +- **LED Controller:** KTD2026 (3-channel RGB) +- **Interfaces:** I2S, I2C/TWI, SPI, USB, ADC, GPIO, PWM, UART +- **Storage:** SD card (FAT/exFAT) +- **Bootloader:** MCUboot + +## I2C Bus Topology + +| Bus | Address | Role | Speed | Devices | +|-----|---------|------|-------|---------| +| I2C1 | i2c@9000 | Power | 400 kHz | KTD2026 (0x30), BQ27220 (0x55), BQ25120A (0x6A) | +| I2C2 | i2c@b000 | Audio | 400 kHz | Pulse Oximeter/PPG MAXM86161 (0x62), ADAU1860 (0x64) | +| I2C3 | i2c@c000 | Sensors | 1 MHz (FM+) | Bone Conductor BMA580 (0x18), IMU BMX160 (0x68), Barometer BMP388 (0x76), Optical Temp MLX90632 (0x3A) | + +## Pullups/Pulldowns + +NRF5340 Internal Pullups: +- ON +- OFF +- CC_#PG +- INT +- GPOUT +- SD_STATE + +NRF5340 Internal Pulldowns: +- LSCTRL +- ON+BTN \ No newline at end of file diff --git a/doc/OpenEarable-PCB/OpenEarable-PCB-debugging-1.0/Layout.pdf b/doc/OpenEarable-PCB/OpenEarable-PCB-debugging-1.0/Layout.pdf new file mode 100644 index 00000000..38678d09 Binary files /dev/null and b/doc/OpenEarable-PCB/OpenEarable-PCB-debugging-1.0/Layout.pdf differ diff --git a/doc/OpenEarable-PCB/OpenEarable-PCB-debugging-1.0/OpenEarable - Debugging Breakout.json b/doc/OpenEarable-PCB/OpenEarable-PCB-debugging-1.0/OpenEarable - Debugging Breakout.json new file mode 100644 index 00000000..d1382a9c --- /dev/null +++ b/doc/OpenEarable-PCB/OpenEarable-PCB-debugging-1.0/OpenEarable - Debugging Breakout.json @@ -0,0 +1,314 @@ +{ + "head": { + "docType": "3", + "editorVersion": "6.5.51", + "newgId": true, + "c_para": {}, + "x": "4020", + "y": "3433", + "hasIdFlag": true, + "importFlag": 0, + "transformList": "" + }, + "canvas": "CA~1000~1000~#000000~yes~#FFFFFF~10~1000~1000~line~0.3937~mm~1~45~visible~0.1~4020~3433~1~yes", + "shape": [ + "TRACK~1~10~S$5147~4198 3101.5 4198 3076.31 4231.02 3076.31 4231.02 3149.14 4200.5 3149.14~gge5146~0", + "TRACK~1~10~S$5143~4100.5 3124.5 4198.5 3124.5~gge5142~0", + "TRACK~1~10~S$5151~4198.5 3124.5 4198.5 3149.14 4201.41 3149.14~gge5150~0", + "TRACK~1~10~S$5097~4079.8424 3101.5046 4100.5 3101.5~gge5123~0", + "TRACK~1~10~S$5093~4079.8424 3101.5046 4079.84 3101.49 4079.84 3124.5 4100.5 3124.5~gge5120~0", + "TRACK~1~10~S$5130~4100.5 3101.5 4198 3101.5~gge5129~0", + "TEXT~L~4103.858~3122.764~0.2~0~0~3~~1.2~SWCLK~M 4104.6186 3121.72 L 4104.5086 3121.61 L 4104.3486 3121.55 L 4104.1286 3121.55 L 4103.9686 3121.61 L 4103.8586 3121.72 L 4103.8586 3121.83 L 4103.9086 3121.94 L 4103.9686 3121.99 L 4104.0786 3122.04 L 4104.3986 3122.15 L 4104.5086 3122.21 L 4104.5686 3122.26 L 4104.6186 3122.37 L 4104.6186 3122.54 L 4104.5086 3122.64 L 4104.3486 3122.7 L 4104.1286 3122.7 L 4103.9686 3122.64 L 4103.8586 3122.54 M 4104.9786 3121.55 L 4105.2586 3122.7 M 4105.5286 3121.55 L 4105.2586 3122.7 M 4105.5286 3121.55 L 4105.7986 3122.7 M 4106.0686 3121.55 L 4105.7986 3122.7 M 4107.2486 3121.83 L 4107.1986 3121.72 L 4107.0886 3121.61 L 4106.9786 3121.55 L 4106.7586 3121.55 L 4106.6486 3121.61 L 4106.5386 3121.72 L 4106.4886 3121.83 L 4106.4286 3121.99 L 4106.4286 3122.26 L 4106.4886 3122.43 L 4106.5386 3122.54 L 4106.6486 3122.64 L 4106.7586 3122.7 L 4106.9786 3122.7 L 4107.0886 3122.64 L 4107.1986 3122.54 L 4107.2486 3122.43 M 4107.6086 3121.55 L 4107.6086 3122.7 M 4107.6086 3122.7 L 4108.2686 3122.7 M 4108.6286 3121.55 L 4108.6286 3122.7 M 4109.3886 3121.55 L 4108.6286 3122.32 M 4108.8986 3122.04 L 4109.3886 3122.7~~gge6012~~0~pinpart", + "TEXT~L~4103.858~3120.009~0.2~0~0~3~~1.2~SWDIO~M 4104.6186 3118.9637 L 4104.5086 3118.8537 L 4104.3486 3118.7937 L 4104.1286 3118.7937 L 4103.9686 3118.8537 L 4103.8586 3118.9637 L 4103.8586 3119.0737 L 4103.9086 3119.1837 L 4103.9686 3119.2337 L 4104.0786 3119.2837 L 4104.3986 3119.3937 L 4104.5086 3119.4537 L 4104.5686 3119.5037 L 4104.6186 3119.6137 L 4104.6186 3119.7837 L 4104.5086 3119.8837 L 4104.3486 3119.9437 L 4104.1286 3119.9437 L 4103.9686 3119.8837 L 4103.8586 3119.7837 M 4104.9786 3118.7937 L 4105.2586 3119.9437 M 4105.5286 3118.7937 L 4105.2586 3119.9437 M 4105.5286 3118.7937 L 4105.7986 3119.9437 M 4106.0686 3118.7937 L 4105.7986 3119.9437 M 4106.4286 3118.7937 L 4106.4286 3119.9437 M 4106.4286 3118.7937 L 4106.8186 3118.7937 L 4106.9786 3118.8537 L 4107.0886 3118.9637 L 4107.1386 3119.0737 L 4107.1986 3119.2337 L 4107.1986 3119.5037 L 4107.1386 3119.6737 L 4107.0886 3119.7837 L 4106.9786 3119.8837 L 4106.8186 3119.9437 L 4106.4286 3119.9437 M 4107.5586 3118.7937 L 4107.5586 3119.9437 M 4108.2386 3118.7937 L 4108.1386 3118.8537 L 4108.0286 3118.9637 L 4107.9686 3119.0737 L 4107.9186 3119.2337 L 4107.9186 3119.5037 L 4107.9686 3119.6737 L 4108.0286 3119.7837 L 4108.1386 3119.8837 L 4108.2386 3119.9437 L 4108.4586 3119.9437 L 4108.5686 3119.8837 L 4108.6786 3119.7837 L 4108.7386 3119.6737 L 4108.7886 3119.5037 L 4108.7886 3119.2337 L 4108.7386 3119.0737 L 4108.6786 3118.9637 L 4108.5686 3118.8537 L 4108.4586 3118.7937 L 4108.2386 3118.7937~~gge6000~~0~pinpart", + "TEXT~L~4103.858~3116.859~0.2~0~0~3~~1.2~RESETN~M 4103.856 3115.65 L 4103.856 3116.79 M 4103.856 3115.65 L 4104.346 3115.65 L 4104.516 3115.7 L 4104.566 3115.76 L 4104.626 3115.87 L 4104.626 3115.98 L 4104.566 3116.08 L 4104.516 3116.14 L 4104.346 3116.19 L 4103.856 3116.19 M 4104.236 3116.19 L 4104.626 3116.79 M 4104.986 3115.65 L 4104.986 3116.79 M 4104.986 3115.65 L 4105.686 3115.65 M 4104.986 3116.19 L 4105.416 3116.19 M 4104.986 3116.79 L 4105.686 3116.79 M 4106.816 3115.81 L 4106.706 3115.7 L 4106.546 3115.65 L 4106.326 3115.65 L 4106.156 3115.7 L 4106.046 3115.81 L 4106.046 3115.92 L 4106.106 3116.03 L 4106.156 3116.08 L 4106.266 3116.14 L 4106.596 3116.25 L 4106.706 3116.3 L 4106.756 3116.36 L 4106.816 3116.47 L 4106.816 3116.63 L 4106.706 3116.74 L 4106.546 3116.79 L 4106.326 3116.79 L 4106.156 3116.74 L 4106.046 3116.63 M 4107.176 3115.65 L 4107.176 3116.79 M 4107.176 3115.65 L 4107.886 3115.65 M 4107.176 3116.19 L 4107.606 3116.19 M 4107.176 3116.79 L 4107.886 3116.79 M 4108.626 3115.65 L 4108.626 3116.79 M 4108.246 3115.65 L 4109.006 3115.65 M 4109.366 3115.65 L 4109.366 3116.79 M 4109.366 3115.65 L 4110.126 3116.79 M 4110.126 3115.65 L 4110.126 3116.79~~gge5988~~0~pinpart", + "TEXT~L~4103.858~3113.709~0.2~0~0~3~~1.2~GND~M 4104.6786 3112.77 L 4104.6186 3112.66 L 4104.5086 3112.55 L 4104.3986 3112.5 L 4104.1886 3112.5 L 4104.0786 3112.55 L 4103.9686 3112.66 L 4103.9086 3112.77 L 4103.8586 3112.93 L 4103.8586 3113.21 L 4103.9086 3113.37 L 4103.9686 3113.48 L 4104.0786 3113.59 L 4104.1886 3113.64 L 4104.3986 3113.64 L 4104.5086 3113.59 L 4104.6186 3113.48 L 4104.6786 3113.37 L 4104.6786 3113.21 M 4104.3986 3113.21 L 4104.6786 3113.21 M 4105.0386 3112.5 L 4105.0386 3113.64 M 4105.0386 3112.5 L 4105.7986 3113.64 M 4105.7986 3112.5 L 4105.7986 3113.64 M 4106.1586 3112.5 L 4106.1586 3113.64 M 4106.1586 3112.5 L 4106.5386 3112.5 L 4106.7086 3112.55 L 4106.8186 3112.66 L 4106.8686 3112.77 L 4106.9186 3112.93 L 4106.9186 3113.21 L 4106.8686 3113.37 L 4106.8186 3113.48 L 4106.7086 3113.59 L 4106.5386 3113.64 L 4106.1586 3113.64~~gge5976~~0~pinpart", + "TEXT~L~4103.858~3110.56~0.2~0~0~3~~1.2~1.8V~M 4103.86 3109.57L4103.97 3109.51 L4104.13 3109.35 L4104.13 3110.49 M 4104.55 3110.22L4104.49 3110.28 L4104.55 3110.33 L4104.6 3110.28 L4104.55 3110.22 M 4105.23 3109.35L4105.07 3109.4 L4105.01 3109.51 L4105.01 3109.62 L4105.07 3109.73 L4105.18 3109.79 L4105.4 3109.84 L4105.56 3109.89 L4105.67 3110 L4105.72 3110.11 L4105.72 3110.28 L4105.67 3110.39 L4105.61 3110.44 L4105.45 3110.49 L4105.23 3110.49 L4105.07 3110.44 L4105.01 3110.39 L4104.96 3110.28 L4104.96 3110.11 L4105.01 3110 L4105.12 3109.89 L4105.29 3109.84 L4105.51 3109.79 L4105.61 3109.73 L4105.67 3109.62 L4105.67 3109.51 L4105.61 3109.4 L4105.45 3109.35 L4105.23 3109.35 M 4106.08 3109.35L4106.52 3110.49 M 4106.96 3109.35L4106.52 3110.49 ~~gge5964~~0~pinpart", + "TEXT~L~4104.252~3107.41~0.2~0~0~3~~1.2~IO1~M 4104.2475 3106.1963 L 4104.2475 3107.3463 M 4104.9375 3106.1963 L 4104.8275 3106.2563 L 4104.7175 3106.3663 L 4104.6675 3106.4763 L 4104.6075 3106.6363 L 4104.6075 3106.9063 L 4104.6675 3107.0763 L 4104.7175 3107.1763 L 4104.8275 3107.2863 L 4104.9375 3107.3463 L 4105.1575 3107.3463 L 4105.2675 3107.2863 L 4105.3775 3107.1763 L 4105.4275 3107.0763 L 4105.4875 3106.9063 L 4105.4875 3106.6363 L 4105.4275 3106.4763 L 4105.3775 3106.3663 L 4105.2675 3106.2563 L 4105.1575 3106.1963 L 4104.9375 3106.1963 M 4105.8475 3106.4163 L 4105.9575 3106.3663 L 4106.1175 3106.1963 L 4106.1175 3107.3463~~gge5952~~0~pinpart", + "TEXT~L~4104.252~3104.261~0.2~0~0~3~~1.2~1.8V LS~M 4104.25 3103.27L4104.36 3103.21 L4104.52 3103.05 L4104.52 3104.2 M 4104.94 3103.92L4104.88 3103.98 L4104.94 3104.03 L4104.99 3103.98 L4104.94 3103.92 M 4105.63 3103.05L4105.46 3103.1 L4105.41 3103.21 L4105.41 3103.32 L4105.46 3103.43 L4105.57 3103.49 L4105.79 3103.54 L4105.95 3103.6 L4106.06 3103.7 L4106.12 3103.81 L4106.12 3103.98 L4106.06 3104.09 L4106.01 3104.14 L4105.84 3104.2 L4105.63 3104.2 L4105.46 3104.14 L4105.41 3104.09 L4105.35 3103.98 L4105.35 3103.81 L4105.41 3103.7 L4105.52 3103.6 L4105.68 3103.54 L4105.9 3103.49 L4106.01 3103.43 L4106.06 3103.32 L4106.06 3103.21 L4106.01 3103.1 L4105.84 3103.05 L4105.63 3103.05 M 4106.48 3103.05L4106.91 3104.2 M 4107.35 3103.05L4106.91 3104.2 M 4108.55 3103.05L4108.55 3104.2 M 4108.55 3104.2L4109.2 3104.2 M 4110.33 3103.21L4110.22 3103.1 L4110.06 3103.05 L4109.84 3103.05 L4109.67 3103.1 L4109.56 3103.21 L4109.56 3103.32 L4109.62 3103.43 L4109.67 3103.49 L4109.78 3103.54 L4110.11 3103.65 L4110.22 3103.7 L4110.27 3103.76 L4110.33 3103.87 L4110.33 3104.03 L4110.22 3104.14 L4110.06 3104.2 L4109.84 3104.2 L4109.67 3104.14 L4109.56 3104.03 ~~gge5931~~0~pinpart", + "TEXT~L~4098.346~3104.261~0.2~0~0~3~~1.2~IO3 |~M 4098.3511 3103.05 L 4098.3511 3104.2 M 4099.0311 3103.05 L 4098.9211 3103.1 L 4098.8111 3103.21 L 4098.7611 3103.32 L 4098.7111 3103.49 L 4098.7111 3103.76 L 4098.7611 3103.92 L 4098.8111 3104.03 L 4098.9211 3104.14 L 4099.0311 3104.2 L 4099.2511 3104.2 L 4099.3611 3104.14 L 4099.4711 3104.03 L 4099.5211 3103.92 L 4099.5811 3103.76 L 4099.5811 3103.49 L 4099.5211 3103.32 L 4099.4711 3103.21 L 4099.3611 3103.1 L 4099.2511 3103.05 L 4099.0311 3103.05 M 4100.0511 3103.05 L 4100.6511 3103.05 L 4100.3211 3103.49 L 4100.4811 3103.49 L 4100.5911 3103.54 L 4100.6511 3103.6 L 4100.7011 3103.76 L 4100.7011 3103.87 L 4100.6511 3104.03 L 4100.5411 3104.14 L 4100.3711 3104.2 L 4100.2111 3104.2 L 4100.0511 3104.14 L 4099.9911 3104.09 L 4099.9411 3103.98 M 4101.9011 3102.83 L 4101.9011 3104.58~~gge6078~~0~pinpart", + "TEXT~L~4098.346~3107.41~0.2~0~0~3~~1.2~IO2 |~M 4098.3511 3106.2 L 4098.3511 3107.34 M 4099.0311 3106.2 L 4098.9211 3106.25 L 4098.8111 3106.36 L 4098.7611 3106.47 L 4098.7111 3106.64 L 4098.7111 3106.91 L 4098.7611 3107.07 L 4098.8111 3107.18 L 4098.9211 3107.29 L 4099.0311 3107.34 L 4099.2511 3107.34 L 4099.3611 3107.29 L 4099.4711 3107.18 L 4099.5211 3107.07 L 4099.5811 3106.91 L 4099.5811 3106.64 L 4099.5211 3106.47 L 4099.4711 3106.36 L 4099.3611 3106.25 L 4099.2511 3106.2 L 4099.0311 3106.2 M 4099.9911 3106.47 L 4099.9911 3106.42 L 4100.0511 3106.31 L 4100.1011 3106.25 L 4100.2111 3106.2 L 4100.4311 3106.2 L 4100.5411 3106.25 L 4100.5911 3106.31 L 4100.6511 3106.42 L 4100.6511 3106.53 L 4100.5911 3106.64 L 4100.4811 3106.8 L 4099.9411 3107.34 L 4100.7011 3107.34 M 4101.9011 3105.98 L 4101.9011 3107.73~~gge6081~~0~pinpart", + "TEXT~L~4097.165~3110.56~0.2~0~0~3~~1.2~3.3V |~M 4097.27 3109.35L4097.87 3109.35 L4097.55 3109.79 L4097.71 3109.79 L4097.82 3109.84 L4097.87 3109.89 L4097.93 3110.06 L4097.93 3110.17 L4097.87 3110.33 L4097.77 3110.44 L4097.6 3110.49 L4097.44 3110.49 L4097.27 3110.44 L4097.22 3110.39 L4097.17 3110.28 M 4098.34 3110.22L4098.29 3110.28 L4098.34 3110.33 L4098.4 3110.28 L4098.34 3110.22 M 4098.87 3109.35L4099.47 3109.35 L4099.14 3109.79 L4099.3 3109.79 L4099.41 3109.84 L4099.47 3109.89 L4099.52 3110.06 L4099.52 3110.17 L4099.47 3110.33 L4099.36 3110.44 L4099.19 3110.49 L4099.03 3110.49 L4098.87 3110.44 L4098.81 3110.39 L4098.76 3110.28 M 4099.88 3109.35L4100.32 3110.49 M 4100.75 3109.35L4100.32 3110.49 M 4101.95 3109.13L4101.95 3110.88 ~~gge6084~~0~pinpart", + "TEXT~L~4097.559~3113.709~0.2~0~0~3~~1.2~TCK |~M 4097.9437 3112.5 L 4097.9437 3113.64 M 4097.5637 3112.5 L 4098.3237 3112.5 M 4099.5037 3112.77 L 4099.4437 3112.66 L 4099.3337 3112.55 L 4099.2237 3112.5 L 4099.0137 3112.5 L 4098.9037 3112.55 L 4098.7937 3112.66 L 4098.7337 3112.77 L 4098.6837 3112.93 L 4098.6837 3113.21 L 4098.7337 3113.37 L 4098.7937 3113.48 L 4098.9037 3113.59 L 4099.0137 3113.64 L 4099.2237 3113.64 L 4099.3337 3113.59 L 4099.4437 3113.48 L 4099.5037 3113.37 M 4099.8637 3112.5 L 4099.8637 3113.64 M 4100.6237 3112.5 L 4099.8637 3113.26 M 4100.1337 3112.99 L 4100.6237 3113.64 M 4101.8237 3112.28 L 4101.8237 3114.03~~gge6087~~0~pinpart", + "TEXT~L~4097.559~3116.859~0.2~0~0~3~~1.2~TMS |~M 4097.9437 3115.65 L 4097.9437 3116.79 M 4097.5637 3115.65 L 4098.3237 3115.65 M 4098.6837 3115.65 L 4098.6837 3116.79 M 4098.6837 3115.65 L 4099.1237 3116.79 M 4099.5537 3115.65 L 4099.1237 3116.79 M 4099.5537 3115.65 L 4099.5537 3116.79 M 4100.6837 3115.81 L 4100.5737 3115.7 L 4100.4037 3115.65 L 4100.1837 3115.65 L 4100.0237 3115.7 L 4099.9137 3115.81 L 4099.9137 3115.92 L 4099.9737 3116.03 L 4100.0237 3116.08 L 4100.1337 3116.14 L 4100.4637 3116.25 L 4100.5737 3116.3 L 4100.6237 3116.36 L 4100.6837 3116.47 L 4100.6837 3116.63 L 4100.5737 3116.74 L 4100.4037 3116.79 L 4100.1837 3116.79 L 4100.0237 3116.74 L 4099.9137 3116.63 M 4101.8837 3115.43 L 4101.8837 3117.18~~gge6090~~0~pinpart", + "TEXT~L~4097.559~3120.009~0.2~0~0~3~~1.2~TDO |~M 4097.9437 3118.8 L 4097.9437 3119.94 M 4097.5637 3118.8 L 4098.3237 3118.8 M 4098.6837 3118.8 L 4098.6837 3119.94 M 4098.6837 3118.8 L 4099.0637 3118.8 L 4099.2237 3118.85 L 4099.3337 3118.96 L 4099.3937 3119.07 L 4099.4437 3119.23 L 4099.4437 3119.51 L 4099.3937 3119.67 L 4099.3337 3119.78 L 4099.2237 3119.89 L 4099.0637 3119.94 L 4098.6837 3119.94 M 4100.1337 3118.8 L 4100.0237 3118.85 L 4099.9137 3118.96 L 4099.8637 3119.07 L 4099.8037 3119.23 L 4099.8037 3119.51 L 4099.8637 3119.67 L 4099.9137 3119.78 L 4100.0237 3119.89 L 4100.1337 3119.94 L 4100.3537 3119.94 L 4100.4637 3119.89 L 4100.5737 3119.78 L 4100.6237 3119.67 L 4100.6837 3119.51 L 4100.6837 3119.23 L 4100.6237 3119.07 L 4100.5737 3118.96 L 4100.4637 3118.85 L 4100.3537 3118.8 L 4100.1337 3118.8 M 4101.8837 3118.58 L 4101.8837 3120.32~~gge6093~~0~pinpart", + "TEXT~L~4098.346~3123.158~0.2~0~0~3~~1.2~TDI |~M 4098.7311 3121.95 L 4098.7311 3123.09 M 4098.3511 3121.95 L 4099.1111 3121.95 M 4099.4711 3121.95 L 4099.4711 3123.09 M 4099.4711 3121.95 L 4099.8511 3121.95 L 4100.0111 3122 L 4100.1211 3122.11 L 4100.1811 3122.22 L 4100.2311 3122.38 L 4100.2311 3122.66 L 4100.1811 3122.82 L 4100.1211 3122.93 L 4100.0111 3123.04 L 4099.8511 3123.09 L 4099.4711 3123.09 M 4100.5911 3121.95 L 4100.5911 3123.09 M 4101.7911 3121.73 L 4101.7911 3123.47~~gge6096~~0~pinpart", + "TEXT~L~4117.638~3110.56~0.2~0~0~3~~1.2~1.8V only used for programming!~M 4117.6411 3109.5645 L 4117.7511 3109.5145 L 4117.9111 3109.3445 L 4117.9111 3110.4945 M 4118.3211 3110.2245 L 4118.2711 3110.2745 L 4118.3211 3110.3345 L 4118.3811 3110.2745 L 4118.3211 3110.2245 M 4119.0111 3109.3445 L 4118.8511 3109.4045 L 4118.7911 3109.5145 L 4118.7911 3109.6245 L 4118.8511 3109.7345 L 4118.9611 3109.7845 L 4119.1711 3109.8445 L 4119.3411 3109.8945 L 4119.4511 3110.0045 L 4119.5011 3110.1145 L 4119.5011 3110.2745 L 4119.4511 3110.3845 L 4119.3911 3110.4445 L 4119.2311 3110.4945 L 4119.0111 3110.4945 L 4118.8511 3110.4445 L 4118.7911 3110.3845 L 4118.7411 3110.2745 L 4118.7411 3110.1145 L 4118.7911 3110.0045 L 4118.9011 3109.8945 L 4119.0711 3109.8445 L 4119.2811 3109.7845 L 4119.3911 3109.7345 L 4119.4511 3109.6245 L 4119.4511 3109.5145 L 4119.3911 3109.4045 L 4119.2311 3109.3445 L 4119.0111 3109.3445 M 4119.8611 3109.3445 L 4120.3011 3110.4945 M 4120.7311 3109.3445 L 4120.3011 3110.4945 M 4122.2111 3109.7345 L 4122.1011 3109.7845 L 4121.9911 3109.8945 L 4121.9311 3110.0545 L 4121.9311 3110.1645 L 4121.9911 3110.3345 L 4122.1011 3110.4445 L 4122.2111 3110.4945 L 4122.3711 3110.4945 L 4122.4811 3110.4445 L 4122.5911 3110.3345 L 4122.6411 3110.1645 L 4122.6411 3110.0545 L 4122.5911 3109.8945 L 4122.4811 3109.7845 L 4122.3711 3109.7345 L 4122.2111 3109.7345 M 4123.0011 3109.7345 L 4123.0011 3110.4945 M 4123.0011 3109.9445 L 4123.1711 3109.7845 L 4123.2811 3109.7345 L 4123.4411 3109.7345 L 4123.5511 3109.7845 L 4123.6011 3109.9445 L 4123.6011 3110.4945 M 4123.9611 3109.3445 L 4123.9611 3110.4945 M 4124.3811 3109.7345 L 4124.7111 3110.4945 M 4125.0311 3109.7345 L 4124.7111 3110.4945 L 4124.6011 3110.7145 L 4124.4911 3110.8245 L 4124.3811 3110.8745 L 4124.3211 3110.8745 M 4126.2311 3109.7345 L 4126.2311 3110.2745 L 4126.2911 3110.4445 L 4126.4011 3110.4945 L 4126.5611 3110.4945 L 4126.6711 3110.4445 L 4126.8311 3110.2745 M 4126.8311 3109.7345 L 4126.8311 3110.4945 M 4127.7911 3109.8945 L 4127.7411 3109.7845 L 4127.5711 3109.7345 L 4127.4111 3109.7345 L 4127.2511 3109.7845 L 4127.1911 3109.8945 L 4127.2511 3110.0045 L 4127.3611 3110.0545 L 4127.6311 3110.1145 L 4127.7411 3110.1645 L 4127.7911 3110.2745 L 4127.7911 3110.3345 L 4127.7411 3110.4445 L 4127.5711 3110.4945 L 4127.4111 3110.4945 L 4127.2511 3110.4445 L 4127.1911 3110.3345 M 4128.1511 3110.0545 L 4128.8111 3110.0545 L 4128.8111 3109.9445 L 4128.7511 3109.8445 L 4128.7011 3109.7845 L 4128.5911 3109.7345 L 4128.4311 3109.7345 L 4128.3211 3109.7845 L 4128.2111 3109.8945 L 4128.1511 3110.0545 L 4128.1511 3110.1645 L 4128.2111 3110.3345 L 4128.3211 3110.4445 L 4128.4311 3110.4945 L 4128.5911 3110.4945 L 4128.7011 3110.4445 L 4128.8111 3110.3345 M 4129.8211 3109.3445 L 4129.8211 3110.4945 M 4129.8211 3109.8945 L 4129.7111 3109.7845 L 4129.6011 3109.7345 L 4129.4411 3109.7345 L 4129.3311 3109.7845 L 4129.2211 3109.8945 L 4129.1711 3110.0545 L 4129.1711 3110.1645 L 4129.2211 3110.3345 L 4129.3311 3110.4445 L 4129.4411 3110.4945 L 4129.6011 3110.4945 L 4129.7111 3110.4445 L 4129.8211 3110.3345 M 4131.4611 3109.3445 L 4131.3511 3109.3445 L 4131.2411 3109.4045 L 4131.1911 3109.5645 L 4131.1911 3110.4945 M 4131.0211 3109.7345 L 4131.4011 3109.7345 M 4132.0911 3109.7345 L 4131.9811 3109.7845 L 4131.8711 3109.8945 L 4131.8211 3110.0545 L 4131.8211 3110.1645 L 4131.8711 3110.3345 L 4131.9811 3110.4445 L 4132.0911 3110.4945 L 4132.2511 3110.4945 L 4132.3611 3110.4445 L 4132.4711 3110.3345 L 4132.5311 3110.1645 L 4132.5311 3110.0545 L 4132.4711 3109.8945 L 4132.3611 3109.7845 L 4132.2511 3109.7345 L 4132.0911 3109.7345 M 4132.8911 3109.7345 L 4132.8911 3110.4945 M 4132.8911 3110.0545 L 4132.9411 3109.8945 L 4133.0511 3109.7845 L 4133.1611 3109.7345 L 4133.3211 3109.7345 M 4134.5211 3109.7345 L 4134.5211 3110.8745 M 4134.5211 3109.8945 L 4134.6311 3109.7845 L 4134.7411 3109.7345 L 4134.9111 3109.7345 L 4135.0111 3109.7845 L 4135.1211 3109.8945 L 4135.1811 3110.0545 L 4135.1811 3110.1645 L 4135.1211 3110.3345 L 4135.0111 3110.4445 L 4134.9111 3110.4945 L 4134.7411 3110.4945 L 4134.6311 3110.4445 L 4134.5211 3110.3345 M 4135.5411 3109.7345 L 4135.5411 3110.4945 M 4135.5411 3110.0545 L 4135.5911 3109.8945 L 4135.7011 3109.7845 L 4135.8111 3109.7345 L 4135.9711 3109.7345 M 4136.6111 3109.7345 L 4136.5011 3109.7845 L 4136.3911 3109.8945 L 4136.3311 3110.0545 L 4136.3311 3110.1645 L 4136.3911 3110.3345 L 4136.5011 3110.4445 L 4136.6111 3110.4945 L 4136.7711 3110.4945 L 4136.8811 3110.4445 L 4136.9911 3110.3345 L 4137.0411 3110.1645 L 4137.0411 3110.0545 L 4136.9911 3109.8945 L 4136.8811 3109.7845 L 4136.7711 3109.7345 L 4136.6111 3109.7345 M 4138.0611 3109.7345 L 4138.0611 3110.6045 L 4138.0011 3110.7645 L 4137.9511 3110.8245 L 4137.8411 3110.8745 L 4137.6811 3110.8745 L 4137.5711 3110.8245 M 4138.0611 3109.8945 L 4137.9511 3109.7845 L 4137.8411 3109.7345 L 4137.6811 3109.7345 L 4137.5711 3109.7845 L 4137.4611 3109.8945 L 4137.4011 3110.0545 L 4137.4011 3110.1645 L 4137.4611 3110.3345 L 4137.5711 3110.4445 L 4137.6811 3110.4945 L 4137.8411 3110.4945 L 4137.9511 3110.4445 L 4138.0611 3110.3345 M 4138.4211 3109.7345 L 4138.4211 3110.4945 M 4138.4211 3110.0545 L 4138.4711 3109.8945 L 4138.5811 3109.7845 L 4138.6911 3109.7345 L 4138.8511 3109.7345 M 4139.8711 3109.7345 L 4139.8711 3110.4945 M 4139.8711 3109.8945 L 4139.7611 3109.7845 L 4139.6511 3109.7345 L 4139.4911 3109.7345 L 4139.3811 3109.7845 L 4139.2711 3109.8945 L 4139.2111 3110.0545 L 4139.2111 3110.1645 L 4139.2711 3110.3345 L 4139.3811 3110.4445 L 4139.4911 3110.4945 L 4139.6511 3110.4945 L 4139.7611 3110.4445 L 4139.8711 3110.3345 M 4140.2311 3109.7345 L 4140.2311 3110.4945 M 4140.2311 3109.9445 L 4140.3911 3109.7845 L 4140.5011 3109.7345 L 4140.6711 3109.7345 L 4140.7711 3109.7845 L 4140.8311 3109.9445 L 4140.8311 3110.4945 M 4140.8311 3109.9445 L 4140.9911 3109.7845 L 4141.1011 3109.7345 L 4141.2711 3109.7345 L 4141.3711 3109.7845 L 4141.4311 3109.9445 L 4141.4311 3110.4945 M 4141.7911 3109.7345 L 4141.7911 3110.4945 M 4141.7911 3109.9445 L 4141.9511 3109.7845 L 4142.0611 3109.7345 L 4142.2311 3109.7345 L 4142.3311 3109.7845 L 4142.3911 3109.9445 L 4142.3911 3110.4945 M 4142.3911 3109.9445 L 4142.5511 3109.7845 L 4142.6611 3109.7345 L 4142.8311 3109.7345 L 4142.9311 3109.7845 L 4142.9911 3109.9445 L 4142.9911 3110.4945 M 4143.3511 3109.3445 L 4143.4011 3109.4045 L 4143.4611 3109.3445 L 4143.4011 3109.2945 L 4143.3511 3109.3445 M 4143.4011 3109.7345 L 4143.4011 3110.4945 M 4143.8211 3109.7345 L 4143.8211 3110.4945 M 4143.8211 3109.9445 L 4143.9811 3109.7845 L 4144.0911 3109.7345 L 4144.2511 3109.7345 L 4144.3611 3109.7845 L 4144.4211 3109.9445 L 4144.4211 3110.4945 M 4145.4311 3109.7345 L 4145.4311 3110.6045 L 4145.3811 3110.7645 L 4145.3211 3110.8245 L 4145.2111 3110.8745 L 4145.0511 3110.8745 L 4144.9411 3110.8245 M 4145.4311 3109.8945 L 4145.3211 3109.7845 L 4145.2111 3109.7345 L 4145.0511 3109.7345 L 4144.9411 3109.7845 L 4144.8311 3109.8945 L 4144.7811 3110.0545 L 4144.7811 3110.1645 L 4144.8311 3110.3345 L 4144.9411 3110.4445 L 4145.0511 3110.4945 L 4145.2111 3110.4945 L 4145.3211 3110.4445 L 4145.4311 3110.3345 M 4145.8511 3109.3445 L 4145.8511 3110.1145 M 4145.8511 3110.3845 L 4145.7911 3110.4445 L 4145.8511 3110.4945 L 4145.9011 3110.4445 L 4145.8511 3110.3845~~gge6478~~0~pinpart", + "TEXT~L~4117.244~3104.261~0.2~0~0~3~~1.2~1.8V LS used for powering external components~M 4117.2474 3103.2705 L 4117.3574 3103.2105 L 4117.5174 3103.0505 L 4117.5174 3104.1905 M 4117.9274 3103.9205 L 4117.8774 3103.9805 L 4117.9274 3104.0305 L 4117.9874 3103.9805 L 4117.9274 3103.9205 M 4118.6174 3103.0505 L 4118.4574 3103.1005 L 4118.3974 3103.2105 L 4118.3974 3103.3205 L 4118.4574 3103.4305 L 4118.5674 3103.4905 L 4118.7774 3103.5405 L 4118.9474 3103.5905 L 4119.0574 3103.7005 L 4119.1074 3103.8105 L 4119.1074 3103.9805 L 4119.0574 3104.0905 L 4118.9974 3104.1405 L 4118.8374 3104.1905 L 4118.6174 3104.1905 L 4118.4574 3104.1405 L 4118.3974 3104.0905 L 4118.3474 3103.9805 L 4118.3474 3103.8105 L 4118.3974 3103.7005 L 4118.5074 3103.5905 L 4118.6774 3103.5405 L 4118.8874 3103.4905 L 4118.9974 3103.4305 L 4119.0574 3103.3205 L 4119.0574 3103.2105 L 4118.9974 3103.1005 L 4118.8374 3103.0505 L 4118.6174 3103.0505 M 4119.4674 3103.0505 L 4119.9074 3104.1905 M 4120.3374 3103.0505 L 4119.9074 3104.1905 M 4121.5374 3103.0505 L 4121.5374 3104.1905 M 4121.5374 3104.1905 L 4122.1974 3104.1905 M 4123.3174 3103.2105 L 4123.2074 3103.1005 L 4123.0474 3103.0505 L 4122.8274 3103.0505 L 4122.6674 3103.1005 L 4122.5574 3103.2105 L 4122.5574 3103.3205 L 4122.6074 3103.4305 L 4122.6674 3103.4905 L 4122.7774 3103.5405 L 4123.0974 3103.6505 L 4123.2074 3103.7005 L 4123.2674 3103.7605 L 4123.3174 3103.8705 L 4123.3174 3104.0305 L 4123.2074 3104.1405 L 4123.0474 3104.1905 L 4122.8274 3104.1905 L 4122.6674 3104.1405 L 4122.5574 3104.0305 M 4124.5174 3103.4305 L 4124.5174 3103.9805 L 4124.5774 3104.1405 L 4124.6874 3104.1905 L 4124.8474 3104.1905 L 4124.9574 3104.1405 L 4125.1174 3103.9805 M 4125.1174 3103.4305 L 4125.1174 3104.1905 M 4126.0774 3103.5905 L 4126.0274 3103.4905 L 4125.8574 3103.4305 L 4125.6974 3103.4305 L 4125.5374 3103.4905 L 4125.4774 3103.5905 L 4125.5374 3103.7005 L 4125.6474 3103.7605 L 4125.9174 3103.8105 L 4126.0274 3103.8705 L 4126.0774 3103.9805 L 4126.0774 3104.0305 L 4126.0274 3104.1405 L 4125.8574 3104.1905 L 4125.6974 3104.1905 L 4125.5374 3104.1405 L 4125.4774 3104.0305 M 4126.4374 3103.7605 L 4127.0974 3103.7605 L 4127.0974 3103.6505 L 4127.0374 3103.5405 L 4126.9874 3103.4905 L 4126.8774 3103.4305 L 4126.7174 3103.4305 L 4126.6074 3103.4905 L 4126.4974 3103.5905 L 4126.4374 3103.7605 L 4126.4374 3103.8705 L 4126.4974 3104.0305 L 4126.6074 3104.1405 L 4126.7174 3104.1905 L 4126.8774 3104.1905 L 4126.9874 3104.1405 L 4127.0974 3104.0305 M 4128.1074 3103.0505 L 4128.1074 3104.1905 M 4128.1074 3103.5905 L 4127.9974 3103.4905 L 4127.8874 3103.4305 L 4127.7274 3103.4305 L 4127.6174 3103.4905 L 4127.5074 3103.5905 L 4127.4574 3103.7605 L 4127.4574 3103.8705 L 4127.5074 3104.0305 L 4127.6174 3104.1405 L 4127.7274 3104.1905 L 4127.8874 3104.1905 L 4127.9974 3104.1405 L 4128.1074 3104.0305 M 4129.7474 3103.0505 L 4129.6374 3103.0505 L 4129.5274 3103.1005 L 4129.4774 3103.2705 L 4129.4774 3104.1905 M 4129.3074 3103.4305 L 4129.6874 3103.4305 M 4130.3774 3103.4305 L 4130.2674 3103.4905 L 4130.1574 3103.5905 L 4130.1074 3103.7605 L 4130.1074 3103.8705 L 4130.1574 3104.0305 L 4130.2674 3104.1405 L 4130.3774 3104.1905 L 4130.5374 3104.1905 L 4130.6474 3104.1405 L 4130.7574 3104.0305 L 4130.8174 3103.8705 L 4130.8174 3103.7605 L 4130.7574 3103.5905 L 4130.6474 3103.4905 L 4130.5374 3103.4305 L 4130.3774 3103.4305 M 4131.1774 3103.4305 L 4131.1774 3104.1905 M 4131.1774 3103.7605 L 4131.2274 3103.5905 L 4131.3374 3103.4905 L 4131.4474 3103.4305 L 4131.6074 3103.4305 M 4132.8074 3103.4305 L 4132.8074 3104.5805 M 4132.8074 3103.5905 L 4132.9174 3103.4905 L 4133.0274 3103.4305 L 4133.1974 3103.4305 L 4133.2974 3103.4905 L 4133.4074 3103.5905 L 4133.4674 3103.7605 L 4133.4674 3103.8705 L 4133.4074 3104.0305 L 4133.2974 3104.1405 L 4133.1974 3104.1905 L 4133.0274 3104.1905 L 4132.9174 3104.1405 L 4132.8074 3104.0305 M 4134.0974 3103.4305 L 4133.9874 3103.4905 L 4133.8774 3103.5905 L 4133.8274 3103.7605 L 4133.8274 3103.8705 L 4133.8774 3104.0305 L 4133.9874 3104.1405 L 4134.0974 3104.1905 L 4134.2574 3104.1905 L 4134.3674 3104.1405 L 4134.4774 3104.0305 L 4134.5374 3103.8705 L 4134.5374 3103.7605 L 4134.4774 3103.5905 L 4134.3674 3103.4905 L 4134.2574 3103.4305 L 4134.0974 3103.4305 M 4134.8974 3103.4305 L 4135.1174 3104.1905 M 4135.3274 3103.4305 L 4135.1174 3104.1905 M 4135.3274 3103.4305 L 4135.5474 3104.1905 M 4135.7674 3103.4305 L 4135.5474 3104.1905 M 4136.1274 3103.7605 L 4136.7774 3103.7605 L 4136.7774 3103.6505 L 4136.7274 3103.5405 L 4136.6774 3103.4905 L 4136.5674 3103.4305 L 4136.3974 3103.4305 L 4136.2874 3103.4905 L 4136.1774 3103.5905 L 4136.1274 3103.7605 L 4136.1274 3103.8705 L 4136.1774 3104.0305 L 4136.2874 3104.1405 L 4136.3974 3104.1905 L 4136.5674 3104.1905 L 4136.6774 3104.1405 L 4136.7774 3104.0305 M 4137.1374 3103.4305 L 4137.1374 3104.1905 M 4137.1374 3103.7605 L 4137.1974 3103.5905 L 4137.3074 3103.4905 L 4137.4174 3103.4305 L 4137.5774 3103.4305 M 4137.9374 3103.0505 L 4137.9974 3103.1005 L 4138.0474 3103.0505 L 4137.9974 3102.9905 L 4137.9374 3103.0505 M 4137.9974 3103.4305 L 4137.9974 3104.1905 M 4138.4074 3103.4305 L 4138.4074 3104.1905 M 4138.4074 3103.6505 L 4138.5674 3103.4905 L 4138.6774 3103.4305 L 4138.8474 3103.4305 L 4138.9574 3103.4905 L 4139.0074 3103.6505 L 4139.0074 3104.1905 M 4140.0174 3103.4305 L 4140.0174 3104.3005 L 4139.9674 3104.4705 L 4139.9174 3104.5205 L 4139.8074 3104.5805 L 4139.6374 3104.5805 L 4139.5274 3104.5205 M 4140.0174 3103.5905 L 4139.9174 3103.4905 L 4139.8074 3103.4305 L 4139.6374 3103.4305 L 4139.5274 3103.4905 L 4139.4174 3103.5905 L 4139.3674 3103.7605 L 4139.3674 3103.8705 L 4139.4174 3104.0305 L 4139.5274 3104.1405 L 4139.6374 3104.1905 L 4139.8074 3104.1905 L 4139.9174 3104.1405 L 4140.0174 3104.0305 M 4141.2174 3103.7605 L 4141.8774 3103.7605 L 4141.8774 3103.6505 L 4141.8174 3103.5405 L 4141.7674 3103.4905 L 4141.6574 3103.4305 L 4141.4974 3103.4305 L 4141.3874 3103.4905 L 4141.2774 3103.5905 L 4141.2174 3103.7605 L 4141.2174 3103.8705 L 4141.2774 3104.0305 L 4141.3874 3104.1405 L 4141.4974 3104.1905 L 4141.6574 3104.1905 L 4141.7674 3104.1405 L 4141.8774 3104.0305 M 4142.2374 3103.4305 L 4142.8374 3104.1905 M 4142.8374 3103.4305 L 4142.2374 3104.1905 M 4143.3574 3103.0505 L 4143.3574 3103.9805 L 4143.4174 3104.1405 L 4143.5274 3104.1905 L 4143.6374 3104.1905 M 4143.1974 3103.4305 L 4143.5774 3103.4305 M 4143.9974 3103.7605 L 4144.6474 3103.7605 L 4144.6474 3103.6505 L 4144.5974 3103.5405 L 4144.5374 3103.4905 L 4144.4274 3103.4305 L 4144.2674 3103.4305 L 4144.1574 3103.4905 L 4144.0474 3103.5905 L 4143.9974 3103.7605 L 4143.9974 3103.8705 L 4144.0474 3104.0305 L 4144.1574 3104.1405 L 4144.2674 3104.1905 L 4144.4274 3104.1905 L 4144.5374 3104.1405 L 4144.6474 3104.0305 M 4145.0074 3103.4305 L 4145.0074 3104.1905 M 4145.0074 3103.7605 L 4145.0574 3103.5905 L 4145.1674 3103.4905 L 4145.2774 3103.4305 L 4145.4474 3103.4305 M 4145.8074 3103.4305 L 4145.8074 3104.1905 M 4145.8074 3103.6505 L 4145.9674 3103.4905 L 4146.0774 3103.4305 L 4146.2374 3103.4305 L 4146.3474 3103.4905 L 4146.4074 3103.6505 L 4146.4074 3104.1905 M 4147.4174 3103.4305 L 4147.4174 3104.1905 M 4147.4174 3103.5905 L 4147.3074 3103.4905 L 4147.1974 3103.4305 L 4147.0374 3103.4305 L 4146.9274 3103.4905 L 4146.8174 3103.5905 L 4146.7674 3103.7605 L 4146.7674 3103.8705 L 4146.8174 3104.0305 L 4146.9274 3104.1405 L 4147.0374 3104.1905 L 4147.1974 3104.1905 L 4147.3074 3104.1405 L 4147.4174 3104.0305 M 4147.7774 3103.0505 L 4147.7774 3104.1905 M 4149.6374 3103.5905 L 4149.5274 3103.4905 L 4149.4174 3103.4305 L 4149.2474 3103.4305 L 4149.1374 3103.4905 L 4149.0374 3103.5905 L 4148.9774 3103.7605 L 4148.9774 3103.8705 L 4149.0374 3104.0305 L 4149.1374 3104.1405 L 4149.2474 3104.1905 L 4149.4174 3104.1905 L 4149.5274 3104.1405 L 4149.6374 3104.0305 M 4150.2674 3103.4305 L 4150.1574 3103.4905 L 4150.0474 3103.5905 L 4149.9974 3103.7605 L 4149.9974 3103.8705 L 4150.0474 3104.0305 L 4150.1574 3104.1405 L 4150.2674 3104.1905 L 4150.4274 3104.1905 L 4150.5374 3104.1405 L 4150.6474 3104.0305 L 4150.6974 3103.8705 L 4150.6974 3103.7605 L 4150.6474 3103.5905 L 4150.5374 3103.4905 L 4150.4274 3103.4305 L 4150.2674 3103.4305 M 4151.0574 3103.4305 L 4151.0574 3104.1905 M 4151.0574 3103.6505 L 4151.2274 3103.4905 L 4151.3374 3103.4305 L 4151.4974 3103.4305 L 4151.6074 3103.4905 L 4151.6574 3103.6505 L 4151.6574 3104.1905 M 4151.6574 3103.6505 L 4151.8274 3103.4905 L 4151.9374 3103.4305 L 4152.0974 3103.4305 L 4152.2074 3103.4905 L 4152.2574 3103.6505 L 4152.2574 3104.1905 M 4152.6174 3103.4305 L 4152.6174 3104.5805 M 4152.6174 3103.5905 L 4152.7274 3103.4905 L 4152.8374 3103.4305 L 4153.0074 3103.4305 L 4153.1174 3103.4905 L 4153.2174 3103.5905 L 4153.2774 3103.7605 L 4153.2774 3103.8705 L 4153.2174 3104.0305 L 4153.1174 3104.1405 L 4153.0074 3104.1905 L 4152.8374 3104.1905 L 4152.7274 3104.1405 L 4152.6174 3104.0305 M 4153.9074 3103.4305 L 4153.7974 3103.4905 L 4153.6874 3103.5905 L 4153.6374 3103.7605 L 4153.6374 3103.8705 L 4153.6874 3104.0305 L 4153.7974 3104.1405 L 4153.9074 3104.1905 L 4154.0774 3104.1905 L 4154.1774 3104.1405 L 4154.2874 3104.0305 L 4154.3474 3103.8705 L 4154.3474 3103.7605 L 4154.2874 3103.5905 L 4154.1774 3103.4905 L 4154.0774 3103.4305 L 4153.9074 3103.4305 M 4154.7074 3103.4305 L 4154.7074 3104.1905 M 4154.7074 3103.6505 L 4154.8674 3103.4905 L 4154.9774 3103.4305 L 4155.1374 3103.4305 L 4155.2474 3103.4905 L 4155.3074 3103.6505 L 4155.3074 3104.1905 M 4155.6674 3103.7605 L 4156.3174 3103.7605 L 4156.3174 3103.6505 L 4156.2674 3103.5405 L 4156.2074 3103.4905 L 4156.0974 3103.4305 L 4155.9374 3103.4305 L 4155.8274 3103.4905 L 4155.7174 3103.5905 L 4155.6674 3103.7605 L 4155.6674 3103.8705 L 4155.7174 3104.0305 L 4155.8274 3104.1405 L 4155.9374 3104.1905 L 4156.0974 3104.1905 L 4156.2074 3104.1405 L 4156.3174 3104.0305 M 4156.6774 3103.4305 L 4156.6774 3104.1905 M 4156.6774 3103.6505 L 4156.8474 3103.4905 L 4156.9574 3103.4305 L 4157.1174 3103.4305 L 4157.2274 3103.4905 L 4157.2774 3103.6505 L 4157.2774 3104.1905 M 4157.8074 3103.0505 L 4157.8074 3103.9805 L 4157.8574 3104.1405 L 4157.9674 3104.1905 L 4158.0774 3104.1905 M 4157.6374 3103.4305 L 4158.0174 3103.4305 M 4159.0374 3103.5905 L 4158.9774 3103.4905 L 4158.8174 3103.4305 L 4158.6574 3103.4305 L 4158.4874 3103.4905 L 4158.4374 3103.5905 L 4158.4874 3103.7005 L 4158.5974 3103.7605 L 4158.8774 3103.8105 L 4158.9774 3103.8705 L 4159.0374 3103.9805 L 4159.0374 3104.0305 L 4158.9774 3104.1405 L 4158.8174 3104.1905 L 4158.6574 3104.1905 L 4158.4874 3104.1405 L 4158.4374 3104.0305~~gge6490~~0~pinpart", + "TRACK~1~1~1~4092.5 3122.45 4198.43 3122.45 4200.31 3124.33 4200.31 3143.23 4204.65 3147.57 4214.49 3147.57 4219.21 3142.84~gge6426~0", + "TRACK~1~1~3~4092.5 3119.3 4197.64 3119.3 4202.28 3123.95 4202.28 3133.39 4206.61 3137.73 4214.88 3137.73 4219.76 3132.84~gge6420~0", + "TRACK~1~1~5~4092.5 3116.15 4197.24 3116.15 4204.25 3123.16 4204.25 3125.52 4206.61 3127.88 4214.49 3127.88 4219.53 3122.84~gge6417~0", + "TRACK~1~1~7~4092.5 3113 4198.74 3112.92 4203.86 3118.04 4214.49 3118.04 4219.68 3112.84~gge6414~0", + "TRACK~1~1~9~4088.11 3109.77 4204.02 3109.77 4205.99 3107.8 4214.09 3107.8 4219.05 3102.84~gge6411~0", + "TRACK~1~1~11~4092.5 3106.7 4198.27 3106.7 4207.4 3097.57 4214.49 3097.57 4219.21 3092.84~gge6405~0", + "TRACK~1~1~14~4079.504 3103.551 4085.3542 3103.551~gge5604~0", + "TRACK~1~1~12~4079.504 3106.701 4085.3542 3106.701~gge5607~0", + "TRACK~1~1~10~4079.504 3109.85 4085.3542 3109.85~gge5610~0", + "TRACK~1~1~8~4079.504 3113 4085.3542 3113~gge5613~0", + "TRACK~1~1~6~4079.504 3116.15 4085.3542 3116.15~gge5616~0", + "TRACK~1~1~4~4079.504 3119.299 4085.3542 3119.299~gge5619~0", + "TRACK~1~1~2~4079.504 3122.449 4085.3542 3122.449~gge5622~0", + "TRACK~1~1~13~4092.5 3103.55 4198.27 3103.55 4202 3099.82 4202 3091.16 4205.43 3087.73 4215.28 3087.73 4219.21 3083~gge6390~0", + "TRACK~1~2~2~4085.35 3122.45 4198.03 3122.45 4200.31 3124.73 4200.31 3138.11 4205.04 3142.84 4209.3702 3142.843~gge6429~0", + "TRACK~1~2~4~4085.35 3119.3 4197.4 3119.3 4202.2831 3124.1831 4202.2831 3129.851 4205.039 3132.6069 4209.1341 3132.6069 4209.3702 3132.843~gge6589~0", + "TRACK~1~2~6~4085.35 3116.07 4202.68 3116.07 4209.45 3122.84~gge6438~0", + "TRACK~1~2~10~4085.35 3109.85 4202.6 3109.85 4209.6 3102.84~gge6408~0", + "TRACK~1~2~8~4085.3501 3113 4209.3697 3112.9219~gge6577~0", + "TRACK~1~2~12~4085.35 3106.7 4197.09 3106.7 4201.89 3101.9 4201.89 3099.54 4208.58 3092.84~gge6402~0", + "TRACK~1~2~14~4085.3501 3103.55 4197.8799 3103.55 4199.9199 3101.5 4199.9199 3086.1499 4203.46 3082.6101 4209.3697 3082.607~gge6580~0", + "TRACK~1~2~14~4209.1352 3082.6101 4209.3651 3082.8401~gge6586~0", + "TRACK~1~2~8~4209.2128 3113 4209.3695 3112.843~gge6583~0", + "TEXT~L~4226.693~3140.087~0.3~90~1~4~~1.5~SWCLK~M 4225.3834 3141.0417 L 4225.247 3140.9054 L 4225.1789 3140.7008 L 4225.1789 3140.4281 L 4225.247 3140.2236 L 4225.3834 3140.0872 L 4225.5198 3140.0872 L 4225.6561 3140.1554 L 4225.7243 3140.2236 L 4225.7925 3140.3599 L 4225.9289 3140.769 L 4225.997 3140.9054 L 4226.0652 3140.9736 L 4226.2016 3141.0417 L 4226.4061 3141.0417 L 4226.5425 3140.9054 L 4226.6107 3140.7008 L 4226.6107 3140.4281 L 4226.5425 3140.2236 L 4226.4061 3140.0872 M 4225.1789 3141.4917 L 4226.6107 3141.8327 M 4225.1789 3142.1736 L 4226.6107 3141.8327 M 4225.1789 3142.1736 L 4226.6107 3142.5145 M 4225.1789 3142.8554 L 4226.6107 3142.5145 M 4225.5198 3144.3281 L 4225.3834 3144.2599 L 4225.247 3144.1236 L 4225.1789 3143.9872 L 4225.1789 3143.7145 L 4225.247 3143.5781 L 4225.3834 3143.4417 L 4225.5198 3143.3736 L 4225.7243 3143.3054 L 4226.0652 3143.3054 L 4226.2698 3143.3736 L 4226.4061 3143.4417 L 4226.5425 3143.5781 L 4226.6107 3143.7145 L 4226.6107 3143.9872 L 4226.5425 3144.1236 L 4226.4061 3144.2599 L 4226.2698 3144.3281 M 4225.1789 3144.7781 L 4226.6107 3144.7781 M 4226.6107 3144.7781 L 4226.6107 3145.5963 M 4225.1789 3146.0463 L 4226.6107 3146.0463 M 4225.1789 3147.0008 L 4226.1334 3146.0463 M 4225.7925 3146.3872 L 4226.6107 3147.0008~~gge6180~~0~pinpart", + "TEXT~L~4227.086~3078.276~0.3~90~1~4~~1.5~1.8V LS~M4225.8451 3078.276L4225.7769 3078.4124 4225.5724 3078.6169 4227.0042 3078.6169M4226.6633 3079.1351L4226.7315 3079.0669 4226.7996 3079.1351 4226.7315 3079.2033 4226.6633 3079.1351M4225.5724 3079.9942L4225.6405 3079.7896 4225.7769 3079.7215 4225.9133 3079.7215 4226.0496 3079.7896 4226.1178 3079.926 4226.186 3080.1987 4226.2542 3080.4033 4226.3905 3080.5396 4226.5269 3080.6078 4226.7315 3080.6078 4226.8678 3080.5396 4226.936 3080.4715 4227.0042 3080.2669 4227.0042 3079.9942 4226.936 3079.7896 4226.8678 3079.7215 4226.7315 3079.6533 4226.5269 3079.6533 4226.3905 3079.7215 4226.2542 3079.8578 4226.186 3080.0624 4226.1178 3080.3351 4226.0496 3080.4715 4225.9133 3080.5396 4225.7769 3080.5396 4225.6405 3080.4715 4225.5724 3080.2669 4225.5724 3079.9942M4225.5724 3081.0578L4227.0042 3081.6033M4225.5724 3082.1487L4227.0042 3081.6033M4225.5724 3083.6487L4227.0042 3083.6487M4227.0042 3083.6487L4227.0042 3084.4669M4225.7769 3085.8715L4225.6405 3085.7351 4225.5724 3085.5305 4225.5724 3085.2578 4225.6405 3085.0533 4225.7769 3084.9169 4225.9133 3084.9169 4226.0496 3084.9851 4226.1178 3085.0533 4226.186 3085.1896 4226.3224 3085.5987 4226.3905 3085.7351 4226.4587 3085.8033 4226.5951 3085.8715 4226.7996 3085.8715 4226.936 3085.7351 4227.0042 3085.5305 4227.0042 3085.2578 4226.936 3085.0533 4226.7996 3084.9169~~gge6162~~0~pinpart", + "TEXT~L~4227.086~3091.662~0.3~90~1~4~~1.5~IO1~M 4225.5723 3091.6611 L 4227.0023 3091.6611 M 4225.5723 3092.5211 L 4225.6423 3092.3811 L 4225.7823 3092.2511 L 4225.9123 3092.1811 L 4226.1223 3092.1111 L 4226.4623 3092.1111 L 4226.6623 3092.1811 L 4226.8023 3092.2511 L 4226.9323 3092.3811 L 4227.0023 3092.5211 L 4227.0023 3092.7911 L 4226.9323 3092.9311 L 4226.8023 3093.0711 L 4226.6623 3093.1311 L 4226.4623 3093.2011 L 4226.1223 3093.2011 L 4225.9123 3093.1311 L 4225.7823 3093.0711 L 4225.6423 3092.9311 L 4225.5723 3092.7911 L 4225.5723 3092.5211 M 4225.8423 3093.6511 L 4225.7823 3093.7911 L 4225.5723 3093.9911 L 4227.0023 3093.9911~~gge6165~~0~pinpart", + "TEXT~L~4227.086~3100.324~0.3~90~1~4~~1.5~+1.8~M 4225.7771 3100.9371 L 4227.0044 3100.9371 M 4226.3907 3100.3235 L 4226.3907 3101.5508 M 4225.8453 3102.0008 L 4225.7771 3102.1371 L 4225.5726 3102.3417 L 4227.0044 3102.3417 M 4226.6635 3102.8599 L 4226.7317 3102.7917 L 4226.7998 3102.8599 L 4226.7317 3102.928 L 4226.6635 3102.8599 M 4225.5726 3103.719 L 4225.6407 3103.5144 L 4225.7771 3103.4462 L 4225.9135 3103.4462 L 4226.0498 3103.5144 L 4226.118 3103.6508 L 4226.1862 3103.9235 L 4226.2544 3104.128 L 4226.3907 3104.2644 L 4226.5271 3104.3326 L 4226.7317 3104.3326 L 4226.868 3104.2644 L 4226.9362 3104.1962 L 4227.0044 3103.9917 L 4227.0044 3103.719 L 4226.9362 3103.5144 L 4226.868 3103.4462 L 4226.7317 3103.378 L 4226.5271 3103.378 L 4226.3907 3103.4462 L 4226.2544 3103.5826 L 4226.1862 3103.7871 L 4226.118 3104.0599 L 4226.0498 3104.1962 L 4225.9135 3104.2644 L 4225.7771 3104.2644 L 4225.6407 3104.1962 L 4225.5726 3103.9917 L 4225.5726 3103.719~~gge6168~~0~pinpart", + "TEXT~L~4227.086~3110.56~0.3~90~1~4~~1.5~GND~M 4225.9103 3111.585 L 4225.7803 3111.515 L 4225.6403 3111.375 L 4225.5703 3111.245 L 4225.5703 3110.965 L 4225.6403 3110.835 L 4225.7803 3110.695 L 4225.9103 3110.625 L 4226.1203 3110.555 L 4226.4603 3110.555 L 4226.6603 3110.625 L 4226.8003 3110.695 L 4226.9403 3110.835 L 4227.0003 3110.965 L 4227.0003 3111.245 L 4226.9403 3111.375 L 4226.8003 3111.515 L 4226.6603 3111.585 L 4226.4603 3111.585 M 4226.4603 3111.245 L 4226.4603 3111.585 M 4225.5703 3112.035 L 4227.0003 3112.035 M 4225.5703 3112.035 L 4227.0003 3112.985 M 4225.5703 3112.985 L 4227.0003 3112.985 M 4225.5703 3113.435 L 4227.0003 3113.435 M 4225.5703 3113.435 L 4225.5703 3113.915 L 4225.6403 3114.115 L 4225.7803 3114.255 L 4225.9103 3114.325 L 4226.1203 3114.395 L 4226.4603 3114.395 L 4226.6603 3114.325 L 4226.8003 3114.255 L 4226.9403 3114.115 L 4227.0003 3113.915 L 4227.0003 3113.435~~gge6171~~0~pinpart", + "TEXT~L~4227.086~3119.615~0.3~90~1~4~~1.5~RESETN~M 4225.5726 3119.6148 L 4227.0044 3119.6148 M 4225.5726 3119.6148 L 4225.5726 3120.2284 L 4225.6407 3120.433 L 4225.7089 3120.5012 L 4225.8453 3120.5693 L 4225.9817 3120.5693 L 4226.118 3120.5012 L 4226.1862 3120.433 L 4226.2544 3120.2284 L 4226.2544 3119.6148 M 4226.2544 3120.0921 L 4227.0044 3120.5693 M 4225.5726 3121.0193 L 4227.0044 3121.0193 M 4225.5726 3121.0193 L 4225.5726 3121.9057 M 4226.2544 3121.0193 L 4226.2544 3121.5648 M 4227.0044 3121.0193 L 4227.0044 3121.9057 M 4225.7771 3123.3103 L 4225.6407 3123.1739 L 4225.5726 3122.9693 L 4225.5726 3122.6966 L 4225.6407 3122.4921 L 4225.7771 3122.3557 L 4225.9135 3122.3557 L 4226.0498 3122.4239 L 4226.118 3122.4921 L 4226.1862 3122.6284 L 4226.3226 3123.0375 L 4226.3907 3123.1739 L 4226.4589 3123.2421 L 4226.5953 3123.3103 L 4226.7998 3123.3103 L 4226.9362 3123.1739 L 4227.0044 3122.9693 L 4227.0044 3122.6966 L 4226.9362 3122.4921 L 4226.7998 3122.3557 M 4225.5726 3123.7603 L 4227.0044 3123.7603 M 4225.5726 3123.7603 L 4225.5726 3124.6466 M 4226.2544 3123.7603 L 4226.2544 3124.3057 M 4227.0044 3123.7603 L 4227.0044 3124.6466 M 4225.5726 3125.5739 L 4227.0044 3125.5739 M 4225.5726 3125.0966 L 4225.5726 3126.0512 M 4225.5726 3126.5012 L 4227.0044 3126.5012 M 4225.5726 3126.5012 L 4227.0044 3127.4557 M 4225.5726 3127.4557 L 4227.0044 3127.4557~~gge6174~~0~pinpart", + "TEXT~L~4227.086~3130.245~0.3~90~1~4~~1.5~SWDIO~M 4225.7771 3131.1992 L 4225.6407 3131.0629 L 4225.5726 3130.8583 L 4225.5726 3130.5856 L 4225.6407 3130.3811 L 4225.7771 3130.2447 L 4225.9135 3130.2447 L 4226.0498 3130.3129 L 4226.118 3130.3811 L 4226.1862 3130.5174 L 4226.3226 3130.9265 L 4226.3907 3131.0629 L 4226.4589 3131.1311 L 4226.5953 3131.1992 L 4226.7998 3131.1992 L 4226.9362 3131.0629 L 4227.0044 3130.8583 L 4227.0044 3130.5856 L 4226.9362 3130.3811 L 4226.7998 3130.2447 M 4225.5726 3131.6492 L 4227.0044 3131.9902 M 4225.5726 3132.3311 L 4227.0044 3131.9902 M 4225.5726 3132.3311 L 4227.0044 3132.672 M 4225.5726 3133.0129 L 4227.0044 3132.672 M 4225.5726 3133.4629 L 4227.0044 3133.4629 M 4225.5726 3133.4629 L 4225.5726 3133.9402 L 4225.6407 3134.1447 L 4225.7771 3134.2811 L 4225.9135 3134.3492 L 4226.118 3134.4174 L 4226.4589 3134.4174 L 4226.6635 3134.3492 L 4226.7998 3134.2811 L 4226.9362 3134.1447 L 4227.0044 3133.9402 L 4227.0044 3133.4629 M 4225.5726 3134.8674 L 4227.0044 3134.8674 M 4225.5726 3135.7265 L 4225.6407 3135.5902 L 4225.7771 3135.4538 L 4225.9135 3135.3856 L 4226.118 3135.3174 L 4226.4589 3135.3174 L 4226.6635 3135.3856 L 4226.7998 3135.4538 L 4226.9362 3135.5902 L 4227.0044 3135.7265 L 4227.0044 3135.9992 L 4226.9362 3136.1356 L 4226.7998 3136.272 L 4226.6635 3136.3402 L 4226.4589 3136.4083 L 4226.118 3136.4083 L 4225.9135 3136.3402 L 4225.7771 3136.272 L 4225.6407 3136.1356 L 4225.5726 3135.9992 L 4225.5726 3135.7265~~gge6177~~0~pinpart", + "TEXT~L~4201.889~3144.418~0.3~270~1~4~~1.5~TDI~M 4203.3997 3143.9402 L 4201.9697 3143.9402 M 4203.3997 3144.4202 L 4203.3997 3143.4602 M 4203.3997 3143.0102 L 4201.9697 3143.0102 M 4203.3997 3143.0102 L 4203.3997 3142.5402 L 4203.3297 3142.3302 L 4203.1997 3142.2002 L 4203.0597 3142.1302 L 4202.8597 3142.0602 L 4202.5197 3142.0602 L 4202.3097 3142.1302 L 4202.1797 3142.2002 L 4202.0397 3142.3302 L 4201.9697 3142.5402 L 4201.9697 3143.0102 M 4203.3997 3141.6102 L 4201.9697 3141.6102~~gge6246~~0~pinpart", + "TEXT~L~4201.889~3134.575~0.3~270~1~4~~1.5~TDO~M 4203.4001 3134.1011 L 4201.9701 3134.1011 M 4203.4001 3134.5711 L 4203.4001 3133.6211 M 4203.4001 3133.1711 L 4201.9701 3133.1711 M 4203.4001 3133.1711 L 4203.4001 3132.6911 L 4203.3301 3132.4911 L 4203.2001 3132.3511 L 4203.0601 3132.2811 L 4202.8601 3132.2211 L 4202.5201 3132.2211 L 4202.3101 3132.2811 L 4202.1801 3132.3511 L 4202.0401 3132.4911 L 4201.9701 3132.6911 L 4201.9701 3133.1711 M 4203.4001 3131.3611 L 4203.3301 3131.4911 L 4203.2001 3131.6311 L 4203.0601 3131.7011 L 4202.8601 3131.7711 L 4202.5201 3131.7711 L 4202.3101 3131.7011 L 4202.1801 3131.6311 L 4202.0401 3131.4911 L 4201.9701 3131.3611 L 4201.9701 3131.0811 L 4202.0401 3130.9511 L 4202.1801 3130.8111 L 4202.3101 3130.7411 L 4202.5201 3130.6711 L 4202.8601 3130.6711 L 4203.0601 3130.7411 L 4203.2001 3130.8111 L 4203.3301 3130.9511 L 4203.4001 3131.0811 L 4203.4001 3131.3611~~gge6249~~0~pinpart", + "TEXT~L~4201.889~3124.339~0.3~270~1~4~~1.5~TMS~M 4203.4069 3123.865 L 4201.9669 3123.865 M 4203.4069 3124.335 L 4203.4069 3123.385 M 4203.4069 3122.935 L 4201.9669 3122.935 M 4203.4069 3122.935 L 4201.9669 3122.385 M 4203.4069 3121.845 L 4201.9669 3122.385 M 4203.4069 3121.845 L 4201.9669 3121.845 M 4203.1969 3120.435 L 4203.3369 3120.575 L 4203.4069 3120.785 L 4203.4069 3121.055 L 4203.3369 3121.255 L 4203.1969 3121.395 L 4203.0669 3121.395 L 4202.9269 3121.325 L 4202.8569 3121.255 L 4202.7869 3121.125 L 4202.6569 3120.715 L 4202.5869 3120.575 L 4202.5169 3120.505 L 4202.3769 3120.435 L 4202.1769 3120.435 L 4202.0369 3120.575 L 4201.9669 3120.785 L 4201.9669 3121.055 L 4202.0369 3121.255 L 4202.1769 3121.395~~gge6252~~0~pinpart", + "TEXT~L~4201.496~3114.497~0.3~270~1~4~~1.5~TCK~M 4203.0122 3114.0165 L 4201.5822 3114.0165 M 4203.0122 3114.4965 L 4203.0122 3113.5465 M 4202.6722 3112.0665 L 4202.8022 3112.1365 L 4202.9422 3112.2765 L 4203.0122 3112.4065 L 4203.0122 3112.6865 L 4202.9422 3112.8165 L 4202.8022 3112.9565 L 4202.6722 3113.0265 L 4202.4622 3113.0965 L 4202.1222 3113.0965 L 4201.9222 3113.0265 L 4201.7822 3112.9565 L 4201.6422 3112.8165 L 4201.5822 3112.6865 L 4201.5822 3112.4065 L 4201.6422 3112.2765 L 4201.7822 3112.1365 L 4201.9222 3112.0665 M 4203.0122 3111.6165 L 4201.5822 3111.6165 M 4203.0122 3110.6665 L 4202.0522 3111.6165 M 4202.3922 3111.2765 L 4201.5822 3110.6665~~gge6255~~0~pinpart", + "TEXT~L~4201.889~3105.048~0.3~270~1~4~~1.5~3.3V~M 4203.404 3104.911 L 4203.404 3104.161 L 4202.854 3104.571 L 4202.854 3104.371 L 4202.794 3104.231 L 4202.724 3104.161 L 4202.514 3104.091 L 4202.384 3104.091 L 4202.174 3104.161 L 4202.044 3104.301 L 4201.974 3104.501 L 4201.974 3104.711 L 4202.044 3104.911 L 4202.104 3104.981 L 4202.244 3105.051 M 4202.314 3103.571 L 4202.244 3103.641 L 4202.174 3103.571 L 4202.244 3103.511 L 4202.314 3103.571 M 4203.404 3102.921 L 4203.404 3102.171 L 4202.854 3102.581 L 4202.854 3102.371 L 4202.794 3102.241 L 4202.724 3102.171 L 4202.514 3102.101 L 4202.384 3102.101 L 4202.174 3102.171 L 4202.044 3102.311 L 4201.974 3102.511 L 4201.974 3102.721 L 4202.044 3102.921 L 4202.104 3102.991 L 4202.244 3103.061 M 4203.404 3101.651 L 4201.974 3101.111 M 4203.404 3100.561 L 4201.974 3101.111~~gge6258~~0~pinpart", + "TEXT~L~4201.889~3093.631~0.3~270~1~4~~1.5~IO2~M 4203.4037 3093.6314 L 4201.9737 3093.6314 M 4203.4037 3092.7714 L 4203.3337 3092.9114 L 4203.1937 3093.0414 L 4203.0637 3093.1114 L 4202.8537 3093.1814 L 4202.5137 3093.1814 L 4202.3137 3093.1114 L 4202.1737 3093.0414 L 4202.0437 3092.9114 L 4201.9737 3092.7714 L 4201.9737 3092.5014 L 4202.0437 3092.3614 L 4202.1737 3092.2214 L 4202.3137 3092.1614 L 4202.5137 3092.0914 L 4202.8537 3092.0914 L 4203.0637 3092.1614 L 4203.1937 3092.2214 L 4203.3337 3092.3614 L 4203.4037 3092.5014 L 4203.4037 3092.7714 M 4203.0637 3091.5714 L 4203.1337 3091.5714 L 4203.2637 3091.5014 L 4203.3337 3091.4314 L 4203.4037 3091.3014 L 4203.4037 3091.0214 L 4203.3337 3090.8914 L 4203.2637 3090.8214 L 4203.1337 3090.7514 L 4202.9937 3090.7514 L 4202.8537 3090.8214 L 4202.6537 3090.9614 L 4201.9737 3091.6414 L 4201.9737 3090.6814~~gge6261~~0~pinpart", + "TEXT~L~4201.889~3084.182~0.3~270~1~4~~1.5~IO3~M 4203.403 3084.1786 L 4201.973 3084.1786 M 4203.403 3083.3186 L 4203.333 3083.4586 L 4203.203 3083.5986 L 4203.063 3083.6686 L 4202.863 3083.7286 L 4202.513 3083.7286 L 4202.313 3083.6686 L 4202.173 3083.5986 L 4202.043 3083.4586 L 4201.973 3083.3186 L 4201.973 3083.0486 L 4202.043 3082.9186 L 4202.173 3082.7786 L 4202.313 3082.7086 L 4202.513 3082.6386 L 4202.863 3082.6386 L 4203.063 3082.7086 L 4203.203 3082.7786 L 4203.333 3082.9186 L 4203.403 3083.0486 L 4203.403 3083.3186 M 4203.403 3082.0586 L 4203.403 3081.3086 L 4202.863 3081.7186 L 4202.863 3081.5086 L 4202.793 3081.3686 L 4202.723 3081.3086 L 4202.513 3081.2386 L 4202.383 3081.2386 L 4202.173 3081.3086 L 4202.043 3081.4386 L 4201.973 3081.6486 L 4201.973 3081.8486 L 4202.043 3082.0586 L 4202.113 3082.1186 L 4202.243 3082.1886~~gge6264~~0~pinpart", + "TEXT~L~4115.221~3115.302~0.27559~180~1~4~~1.9685~1.8V LS used for powering external components~M 4115.2214 3116.9307 L 4115.4004 3117.0202 L 4115.6688 3117.2886 L 4115.6688 3115.4096 M 4116.3488 3115.857 L 4116.2593 3115.7675 L 4116.3488 3115.678 L 4116.4383 3115.7675 L 4116.3488 3115.857 M 4117.4762 3117.2886 L 4117.2078 3117.1991 L 4117.1183 3117.0202 L 4117.1183 3116.8412 L 4117.2078 3116.6623 L 4117.3867 3116.5728 L 4117.7447 3116.4833 L 4118.0131 3116.3938 L 4118.192 3116.2149 L 4118.2815 3116.0359 L 4118.2815 3115.7675 L 4118.192 3115.5885 L 4118.1026 3115.499 L 4117.8341 3115.4096 L 4117.4762 3115.4096 L 4117.2078 3115.499 L 4117.1183 3115.5885 L 4117.0288 3115.7675 L 4117.0288 3116.0359 L 4117.1183 3116.2149 L 4117.2973 3116.3938 L 4117.5657 3116.4833 L 4117.9236 3116.5728 L 4118.1026 3116.6623 L 4118.192 3116.8412 L 4118.192 3117.0202 L 4118.1026 3117.1991 L 4117.8341 3117.2886 L 4117.4762 3117.2886 M 4118.8721 3117.2886 L 4119.5879 3115.4096 M 4120.3037 3117.2886 L 4119.5879 3115.4096 M 4122.2722 3117.2886 L 4122.2722 3115.4096 M 4122.2722 3115.4096 L 4123.3459 3115.4096 M 4125.1892 3117.0202 L 4125.0102 3117.1991 L 4124.7418 3117.2886 L 4124.3839 3117.2886 L 4124.1154 3117.1991 L 4123.9365 3117.0202 L 4123.9365 3116.8412 L 4124.026 3116.6623 L 4124.1154 3116.5728 L 4124.2944 3116.4833 L 4124.8313 3116.3043 L 4125.0102 3116.2149 L 4125.0997 3116.1254 L 4125.1892 3115.9464 L 4125.1892 3115.678 L 4125.0102 3115.499 L 4124.7418 3115.4096 L 4124.3839 3115.4096 L 4124.1154 3115.499 L 4123.9365 3115.678 M 4127.1577 3116.6623 L 4127.1577 3115.7675 L 4127.2471 3115.499 L 4127.4261 3115.4096 L 4127.6945 3115.4096 L 4127.8735 3115.499 L 4128.1419 3115.7675 M 4128.1419 3116.6623 L 4128.1419 3115.4096 M 4129.7167 3116.3938 L 4129.6272 3116.5728 L 4129.3588 3116.6623 L 4129.0904 3116.6623 L 4128.8219 3116.5728 L 4128.7325 3116.3938 L 4128.8219 3116.2149 L 4129.0009 3116.1254 L 4129.4483 3116.0359 L 4129.6272 3115.9464 L 4129.7167 3115.7675 L 4129.7167 3115.678 L 4129.6272 3115.499 L 4129.3588 3115.4096 L 4129.0904 3115.4096 L 4128.8219 3115.499 L 4128.7325 3115.678 M 4130.3073 3116.1254 L 4131.381 3116.1254 L 4131.381 3116.3043 L 4131.2915 3116.4833 L 4131.202 3116.5728 L 4131.0231 3116.6623 L 4130.7547 3116.6623 L 4130.5757 3116.5728 L 4130.3967 3116.3938 L 4130.3073 3116.1254 L 4130.3073 3115.9464 L 4130.3967 3115.678 L 4130.5757 3115.499 L 4130.7547 3115.4096 L 4131.0231 3115.4096 L 4131.202 3115.499 L 4131.381 3115.678 M 4133.0453 3117.2886 L 4133.0453 3115.4096 M 4133.0453 3116.3938 L 4132.8663 3116.5728 L 4132.6874 3116.6623 L 4132.4189 3116.6623 L 4132.24 3116.5728 L 4132.061 3116.3938 L 4131.9715 3116.1254 L 4131.9715 3115.9464 L 4132.061 3115.678 L 4132.24 3115.499 L 4132.4189 3115.4096 L 4132.6874 3115.4096 L 4132.8663 3115.499 L 4133.0453 3115.678 M 4135.7296 3117.2886 L 4135.5506 3117.2886 L 4135.3717 3117.1991 L 4135.2822 3116.9307 L 4135.2822 3115.4096 M 4135.0138 3116.6623 L 4135.6401 3116.6623 M 4136.7675 3116.6623 L 4136.5886 3116.5728 L 4136.4096 3116.3938 L 4136.3201 3116.1254 L 4136.3201 3115.9464 L 4136.4096 3115.678 L 4136.5886 3115.499 L 4136.7675 3115.4096 L 4137.036 3115.4096 L 4137.2149 3115.499 L 4137.3939 3115.678 L 4137.4833 3115.9464 L 4137.4833 3116.1254 L 4137.3939 3116.3938 L 4137.2149 3116.5728 L 4137.036 3116.6623 L 4136.7675 3116.6623 M 4138.0739 3116.6623 L 4138.0739 3115.4096 M 4138.0739 3116.1254 L 4138.1634 3116.3938 L 4138.3423 3116.5728 L 4138.5213 3116.6623 L 4138.7897 3116.6623 M 4140.7582 3116.6623 L 4140.7582 3114.7832 M 4140.7582 3116.3938 L 4140.9372 3116.5728 L 4141.1161 3116.6623 L 4141.3846 3116.6623 L 4141.5635 3116.5728 L 4141.7425 3116.3938 L 4141.8319 3116.1254 L 4141.8319 3115.9464 L 4141.7425 3115.678 L 4141.5635 3115.499 L 4141.3846 3115.4096 L 4141.1161 3115.4096 L 4140.9372 3115.499 L 4140.7582 3115.678 M 4142.8699 3116.6623 L 4142.6909 3116.5728 L 4142.512 3116.3938 L 4142.4225 3116.1254 L 4142.4225 3115.9464 L 4142.512 3115.678 L 4142.6909 3115.499 L 4142.8699 3115.4096 L 4143.1383 3115.4096 L 4143.3173 3115.499 L 4143.4962 3115.678 L 4143.5857 3115.9464 L 4143.5857 3116.1254 L 4143.4962 3116.3938 L 4143.3173 3116.5728 L 4143.1383 3116.6623 L 4142.8699 3116.6623 M 4144.1762 3116.6623 L 4144.5342 3115.4096 M 4144.8921 3116.6623 L 4144.5342 3115.4096 M 4144.8921 3116.6623 L 4145.25 3115.4096 M 4145.6079 3116.6623 L 4145.25 3115.4096 M 4146.1984 3116.1254 L 4147.2722 3116.1254 L 4147.2722 3116.3043 L 4147.1827 3116.4833 L 4147.0932 3116.5728 L 4146.9143 3116.6623 L 4146.6458 3116.6623 L 4146.4669 3116.5728 L 4146.2879 3116.3938 L 4146.1984 3116.1254 L 4146.1984 3115.9464 L 4146.2879 3115.678 L 4146.4669 3115.499 L 4146.6458 3115.4096 L 4146.9143 3115.4096 L 4147.0932 3115.499 L 4147.2722 3115.678 M 4147.8627 3116.6623 L 4147.8627 3115.4096 M 4147.8627 3116.1254 L 4147.9522 3116.3938 L 4148.1311 3116.5728 L 4148.3101 3116.6623 L 4148.5785 3116.6623 M 4149.1691 3117.2886 L 4149.2586 3117.1991 L 4149.348 3117.2886 L 4149.2586 3117.3781 L 4149.1691 3117.2886 M 4149.2586 3116.6623 L 4149.2586 3115.4096 M 4149.9386 3116.6623 L 4149.9386 3115.4096 M 4149.9386 3116.3043 L 4150.207 3116.5728 L 4150.386 3116.6623 L 4150.6544 3116.6623 L 4150.8334 3116.5728 L 4150.9228 3116.3043 L 4150.9228 3115.4096 M 4152.5871 3116.6623 L 4152.5871 3115.2306 L 4152.4976 3114.9622 L 4152.4082 3114.8727 L 4152.2292 3114.7832 L 4151.9608 3114.7832 L 4151.7818 3114.8727 M 4152.5871 3116.3938 L 4152.4082 3116.5728 L 4152.2292 3116.6623 L 4151.9608 3116.6623 L 4151.7818 3116.5728 L 4151.6029 3116.3938 L 4151.5134 3116.1254 L 4151.5134 3115.9464 L 4151.6029 3115.678 L 4151.7818 3115.499 L 4151.9608 3115.4096 L 4152.2292 3115.4096 L 4152.4082 3115.499 L 4152.5871 3115.678 M 4154.5556 3116.1254 L 4155.6293 3116.1254 L 4155.6293 3116.3043 L 4155.5399 3116.4833 L 4155.4504 3116.5728 L 4155.2714 3116.6623 L 4155.003 3116.6623 L 4154.824 3116.5728 L 4154.6451 3116.3938 L 4154.5556 3116.1254 L 4154.5556 3115.9464 L 4154.6451 3115.678 L 4154.824 3115.499 L 4155.003 3115.4096 L 4155.2714 3115.4096 L 4155.4504 3115.499 L 4155.6293 3115.678 M 4156.2199 3116.6623 L 4157.2041 3115.4096 M 4157.2041 3116.6623 L 4156.2199 3115.4096 M 4158.0631 3117.2886 L 4158.0631 3115.7675 L 4158.1526 3115.499 L 4158.3316 3115.4096 L 4158.5105 3115.4096 M 4157.7947 3116.6623 L 4158.421 3116.6623 M 4159.1011 3116.1254 L 4160.1748 3116.1254 L 4160.1748 3116.3043 L 4160.0853 3116.4833 L 4159.9958 3116.5728 L 4159.8169 3116.6623 L 4159.5484 3116.6623 L 4159.3695 3116.5728 L 4159.1905 3116.3938 L 4159.1011 3116.1254 L 4159.1011 3115.9464 L 4159.1905 3115.678 L 4159.3695 3115.499 L 4159.5484 3115.4096 L 4159.8169 3115.4096 L 4159.9958 3115.499 L 4160.1748 3115.678 M 4160.7653 3116.6623 L 4160.7653 3115.4096 M 4160.7653 3116.1254 L 4160.8548 3116.3938 L 4161.0338 3116.5728 L 4161.2127 3116.6623 L 4161.4812 3116.6623 M 4162.0717 3116.6623 L 4162.0717 3115.4096 M 4162.0717 3116.3043 L 4162.3401 3116.5728 L 4162.5191 3116.6623 L 4162.7875 3116.6623 L 4162.9665 3116.5728 L 4163.056 3116.3043 L 4163.056 3115.4096 M 4164.7202 3116.6623 L 4164.7202 3115.4096 M 4164.7202 3116.3938 L 4164.5413 3116.5728 L 4164.3623 3116.6623 L 4164.0939 3116.6623 L 4163.9149 3116.5728 L 4163.736 3116.3938 L 4163.6465 3116.1254 L 4163.6465 3115.9464 L 4163.736 3115.678 L 4163.9149 3115.499 L 4164.0939 3115.4096 L 4164.3623 3115.4096 L 4164.5413 3115.499 L 4164.7202 3115.678 M 4165.3108 3117.2886 L 4165.3108 3115.4096 M 4168.353 3116.3938 L 4168.1741 3116.5728 L 4167.9951 3116.6623 L 4167.7267 3116.6623 L 4167.5477 3116.5728 L 4167.3688 3116.3938 L 4167.2793 3116.1254 L 4167.2793 3115.9464 L 4167.3688 3115.678 L 4167.5477 3115.499 L 4167.7267 3115.4096 L 4167.9951 3115.4096 L 4168.1741 3115.499 L 4168.353 3115.678 M 4169.3909 3116.6623 L 4169.212 3116.5728 L 4169.033 3116.3938 L 4168.9436 3116.1254 L 4168.9436 3115.9464 L 4169.033 3115.678 L 4169.212 3115.499 L 4169.3909 3115.4096 L 4169.6594 3115.4096 L 4169.8383 3115.499 L 4170.0173 3115.678 L 4170.1068 3115.9464 L 4170.1068 3116.1254 L 4170.0173 3116.3938 L 4169.8383 3116.5728 L 4169.6594 3116.6623 L 4169.3909 3116.6623 M 4170.6973 3116.6623 L 4170.6973 3115.4096 M 4170.6973 3116.3043 L 4170.9657 3116.5728 L 4171.1447 3116.6623 L 4171.4131 3116.6623 L 4171.5921 3116.5728 L 4171.6816 3116.3043 L 4171.6816 3115.4096 M 4171.6816 3116.3043 L 4171.95 3116.5728 L 4172.1289 3116.6623 L 4172.3974 3116.6623 L 4172.5763 3116.5728 L 4172.6658 3116.3043 L 4172.6658 3115.4096 M 4173.2564 3116.6623 L 4173.2564 3114.7832 M 4173.2564 3116.3938 L 4173.4353 3116.5728 L 4173.6143 3116.6623 L 4173.8827 3116.6623 L 4174.0617 3116.5728 L 4174.2406 3116.3938 L 4174.3301 3116.1254 L 4174.3301 3115.9464 L 4174.2406 3115.678 L 4174.0617 3115.499 L 4173.8827 3115.4096 L 4173.6143 3115.4096 L 4173.4353 3115.499 L 4173.2564 3115.678 M 4175.368 3116.6623 L 4175.1891 3116.5728 L 4175.0101 3116.3938 L 4174.9206 3116.1254 L 4174.9206 3115.9464 L 4175.0101 3115.678 L 4175.1891 3115.499 L 4175.368 3115.4096 L 4175.6365 3115.4096 L 4175.8154 3115.499 L 4175.9944 3115.678 L 4176.0838 3115.9464 L 4176.0838 3116.1254 L 4175.9944 3116.3938 L 4175.8154 3116.5728 L 4175.6365 3116.6623 L 4175.368 3116.6623 M 4176.6744 3116.6623 L 4176.6744 3115.4096 M 4176.6744 3116.3043 L 4176.9428 3116.5728 L 4177.1218 3116.6623 L 4177.3902 3116.6623 L 4177.5692 3116.5728 L 4177.6586 3116.3043 L 4177.6586 3115.4096 M 4178.2492 3116.1254 L 4179.3229 3116.1254 L 4179.3229 3116.3043 L 4179.2334 3116.4833 L 4179.144 3116.5728 L 4178.965 3116.6623 L 4178.6966 3116.6623 L 4178.5176 3116.5728 L 4178.3387 3116.3938 L 4178.2492 3116.1254 L 4178.2492 3115.9464 L 4178.3387 3115.678 L 4178.5176 3115.499 L 4178.6966 3115.4096 L 4178.965 3115.4096 L 4179.144 3115.499 L 4179.3229 3115.678 M 4179.9135 3116.6623 L 4179.9135 3115.4096 M 4179.9135 3116.3043 L 4180.1819 3116.5728 L 4180.3609 3116.6623 L 4180.6293 3116.6623 L 4180.8082 3116.5728 L 4180.8977 3116.3043 L 4180.8977 3115.4096 M 4181.7567 3117.2886 L 4181.7567 3115.7675 L 4181.8462 3115.499 L 4182.0251 3115.4096 L 4182.2041 3115.4096 M 4181.4883 3116.6623 L 4182.1146 3116.6623 M 4183.7789 3116.3938 L 4183.6894 3116.5728 L 4183.421 3116.6623 L 4183.1525 3116.6623 L 4182.8841 3116.5728 L 4182.7946 3116.3938 L 4182.8841 3116.2149 L 4183.0631 3116.1254 L 4183.5105 3116.0359 L 4183.6894 3115.9464 L 4183.7789 3115.7675 L 4183.7789 3115.678 L 4183.6894 3115.499 L 4183.421 3115.4096 L 4183.1525 3115.4096 L 4182.8841 3115.499 L 4182.7946 3115.678~~gge6628~~0~pinpart", + "TEXT~L~4114.828~3109.003~0.27559~180~1~4~~1.9685~1.8V only used for programming!~M 4114.8277 3110.6315 L 4115.0067 3110.721 L 4115.2751 3110.9894 L 4115.2751 3109.1104 M 4115.9551 3109.5578 L 4115.8656 3109.4683 L 4115.9551 3109.3788 L 4116.0446 3109.4683 L 4115.9551 3109.5578 M 4117.0825 3110.9894 L 4116.8141 3110.8999 L 4116.7246 3110.721 L 4116.7246 3110.542 L 4116.8141 3110.3631 L 4116.9931 3110.2736 L 4117.351 3110.1841 L 4117.6194 3110.0946 L 4117.7983 3109.9157 L 4117.8878 3109.7367 L 4117.8878 3109.4683 L 4117.7983 3109.2893 L 4117.7089 3109.1998 L 4117.4404 3109.1104 L 4117.0825 3109.1104 L 4116.8141 3109.1998 L 4116.7246 3109.2893 L 4116.6351 3109.4683 L 4116.6351 3109.7367 L 4116.7246 3109.9157 L 4116.9036 3110.0946 L 4117.172 3110.1841 L 4117.5299 3110.2736 L 4117.7089 3110.3631 L 4117.7983 3110.542 L 4117.7983 3110.721 L 4117.7089 3110.8999 L 4117.4404 3110.9894 L 4117.0825 3110.9894 M 4118.4784 3110.9894 L 4119.1942 3109.1104 M 4119.91 3110.9894 L 4119.1942 3109.1104 M 4122.3259 3110.3631 L 4122.1469 3110.2736 L 4121.968 3110.0946 L 4121.8785 3109.8262 L 4121.8785 3109.6472 L 4121.968 3109.3788 L 4122.1469 3109.1998 L 4122.3259 3109.1104 L 4122.5943 3109.1104 L 4122.7733 3109.1998 L 4122.9522 3109.3788 L 4123.0417 3109.6472 L 4123.0417 3109.8262 L 4122.9522 3110.0946 L 4122.7733 3110.2736 L 4122.5943 3110.3631 L 4122.3259 3110.3631 M 4123.6323 3110.3631 L 4123.6323 3109.1104 M 4123.6323 3110.0051 L 4123.9007 3110.2736 L 4124.0797 3110.3631 L 4124.3481 3110.3631 L 4124.527 3110.2736 L 4124.6165 3110.0051 L 4124.6165 3109.1104 M 4125.2071 3110.9894 L 4125.2071 3109.1104 M 4125.8871 3110.3631 L 4126.424 3109.1104 M 4126.9608 3110.3631 L 4126.424 3109.1104 L 4126.245 3108.7525 L 4126.066 3108.5735 L 4125.8871 3108.484 L 4125.7976 3108.484 M 4128.9293 3110.3631 L 4128.9293 3109.4683 L 4129.0188 3109.1998 L 4129.1978 3109.1104 L 4129.4662 3109.1104 L 4129.6451 3109.1998 L 4129.9136 3109.4683 M 4129.9136 3110.3631 L 4129.9136 3109.1104 M 4131.4884 3110.0946 L 4131.3989 3110.2736 L 4131.1305 3110.3631 L 4130.862 3110.3631 L 4130.5936 3110.2736 L 4130.5041 3110.0946 L 4130.5936 3109.9157 L 4130.7726 3109.8262 L 4131.2199 3109.7367 L 4131.3989 3109.6472 L 4131.4884 3109.4683 L 4131.4884 3109.3788 L 4131.3989 3109.1998 L 4131.1305 3109.1104 L 4130.862 3109.1104 L 4130.5936 3109.1998 L 4130.5041 3109.3788 M 4132.0789 3109.8262 L 4133.1526 3109.8262 L 4133.1526 3110.0051 L 4133.0632 3110.1841 L 4132.9737 3110.2736 L 4132.7947 3110.3631 L 4132.5263 3110.3631 L 4132.3474 3110.2736 L 4132.1684 3110.0946 L 4132.0789 3109.8262 L 4132.0789 3109.6472 L 4132.1684 3109.3788 L 4132.3474 3109.1998 L 4132.5263 3109.1104 L 4132.7947 3109.1104 L 4132.9737 3109.1998 L 4133.1526 3109.3788 M 4134.8169 3110.9894 L 4134.8169 3109.1104 M 4134.8169 3110.0946 L 4134.638 3110.2736 L 4134.459 3110.3631 L 4134.1906 3110.3631 L 4134.0116 3110.2736 L 4133.8327 3110.0946 L 4133.7432 3109.8262 L 4133.7432 3109.6472 L 4133.8327 3109.3788 L 4134.0116 3109.1998 L 4134.1906 3109.1104 L 4134.459 3109.1104 L 4134.638 3109.1998 L 4134.8169 3109.3788 M 4137.5012 3110.9894 L 4137.3223 3110.9894 L 4137.1433 3110.8999 L 4137.0539 3110.6315 L 4137.0539 3109.1104 M 4136.7854 3110.3631 L 4137.4118 3110.3631 M 4138.5392 3110.3631 L 4138.3602 3110.2736 L 4138.1813 3110.0946 L 4138.0918 3109.8262 L 4138.0918 3109.6472 L 4138.1813 3109.3788 L 4138.3602 3109.1998 L 4138.5392 3109.1104 L 4138.8076 3109.1104 L 4138.9866 3109.1998 L 4139.1655 3109.3788 L 4139.255 3109.6472 L 4139.255 3109.8262 L 4139.1655 3110.0946 L 4138.9866 3110.2736 L 4138.8076 3110.3631 L 4138.5392 3110.3631 M 4139.8455 3110.3631 L 4139.8455 3109.1104 M 4139.8455 3109.8262 L 4139.935 3110.0946 L 4140.114 3110.2736 L 4140.2929 3110.3631 L 4140.5614 3110.3631 M 4142.5299 3110.3631 L 4142.5299 3108.484 M 4142.5299 3110.0946 L 4142.7088 3110.2736 L 4142.8878 3110.3631 L 4143.1562 3110.3631 L 4143.3352 3110.2736 L 4143.5141 3110.0946 L 4143.6036 3109.8262 L 4143.6036 3109.6472 L 4143.5141 3109.3788 L 4143.3352 3109.1998 L 4143.1562 3109.1104 L 4142.8878 3109.1104 L 4142.7088 3109.1998 L 4142.5299 3109.3788 M 4144.1941 3110.3631 L 4144.1941 3109.1104 M 4144.1941 3109.8262 L 4144.2836 3110.0946 L 4144.4626 3110.2736 L 4144.6415 3110.3631 L 4144.91 3110.3631 M 4145.9479 3110.3631 L 4145.7689 3110.2736 L 4145.59 3110.0946 L 4145.5005 3109.8262 L 4145.5005 3109.6472 L 4145.59 3109.3788 L 4145.7689 3109.1998 L 4145.9479 3109.1104 L 4146.2163 3109.1104 L 4146.3953 3109.1998 L 4146.5742 3109.3788 L 4146.6637 3109.6472 L 4146.6637 3109.8262 L 4146.5742 3110.0946 L 4146.3953 3110.2736 L 4146.2163 3110.3631 L 4145.9479 3110.3631 M 4148.328 3110.3631 L 4148.328 3108.9314 L 4148.2385 3108.663 L 4148.149 3108.5735 L 4147.9701 3108.484 L 4147.7017 3108.484 L 4147.5227 3108.5735 M 4148.328 3110.0946 L 4148.149 3110.2736 L 4147.9701 3110.3631 L 4147.7017 3110.3631 L 4147.5227 3110.2736 L 4147.3437 3110.0946 L 4147.2543 3109.8262 L 4147.2543 3109.6472 L 4147.3437 3109.3788 L 4147.5227 3109.1998 L 4147.7017 3109.1104 L 4147.9701 3109.1104 L 4148.149 3109.1998 L 4148.328 3109.3788 M 4148.9185 3110.3631 L 4148.9185 3109.1104 M 4148.9185 3109.8262 L 4149.008 3110.0946 L 4149.187 3110.2736 L 4149.3659 3110.3631 L 4149.6344 3110.3631 M 4151.2986 3110.3631 L 4151.2986 3109.1104 M 4151.2986 3110.0946 L 4151.1197 3110.2736 L 4150.9407 3110.3631 L 4150.6723 3110.3631 L 4150.4933 3110.2736 L 4150.3144 3110.0946 L 4150.2249 3109.8262 L 4150.2249 3109.6472 L 4150.3144 3109.3788 L 4150.4933 3109.1998 L 4150.6723 3109.1104 L 4150.9407 3109.1104 L 4151.1197 3109.1998 L 4151.2986 3109.3788 M 4151.8892 3110.3631 L 4151.8892 3109.1104 M 4151.8892 3110.0051 L 4152.1576 3110.2736 L 4152.3366 3110.3631 L 4152.605 3110.3631 L 4152.784 3110.2736 L 4152.8734 3110.0051 L 4152.8734 3109.1104 M 4152.8734 3110.0051 L 4153.1419 3110.2736 L 4153.3208 3110.3631 L 4153.5893 3110.3631 L 4153.7682 3110.2736 L 4153.8577 3110.0051 L 4153.8577 3109.1104 M 4154.4482 3110.3631 L 4154.4482 3109.1104 M 4154.4482 3110.0051 L 4154.7167 3110.2736 L 4154.8956 3110.3631 L 4155.1641 3110.3631 L 4155.343 3110.2736 L 4155.4325 3110.0051 L 4155.4325 3109.1104 M 4155.4325 3110.0051 L 4155.7009 3110.2736 L 4155.8799 3110.3631 L 4156.1483 3110.3631 L 4156.3273 3110.2736 L 4156.4167 3110.0051 L 4156.4167 3109.1104 M 4157.0073 3110.9894 L 4157.0968 3110.8999 L 4157.1862 3110.9894 L 4157.0968 3111.0789 L 4157.0073 3110.9894 M 4157.0968 3110.3631 L 4157.0968 3109.1104 M 4157.7768 3110.3631 L 4157.7768 3109.1104 M 4157.7768 3110.0051 L 4158.0452 3110.2736 L 4158.2242 3110.3631 L 4158.4926 3110.3631 L 4158.6716 3110.2736 L 4158.761 3110.0051 L 4158.761 3109.1104 M 4160.4253 3110.3631 L 4160.4253 3108.9314 L 4160.3358 3108.663 L 4160.2464 3108.5735 L 4160.0674 3108.484 L 4159.799 3108.484 L 4159.62 3108.5735 M 4160.4253 3110.0946 L 4160.2464 3110.2736 L 4160.0674 3110.3631 L 4159.799 3110.3631 L 4159.62 3110.2736 L 4159.4411 3110.0946 L 4159.3516 3109.8262 L 4159.3516 3109.6472 L 4159.4411 3109.3788 L 4159.62 3109.1998 L 4159.799 3109.1104 L 4160.0674 3109.1104 L 4160.2464 3109.1998 L 4160.4253 3109.3788 M 4161.1053 3110.9894 L 4161.1053 3109.7367 M 4161.1053 3109.2893 L 4161.0159 3109.1998 L 4161.1053 3109.1104 L 4161.1948 3109.1998 L 4161.1053 3109.2893~~gge6625~~0~pinpart", + "LIB~4209.3697~3142.8431~package`HDRV14W67P254_2X7_1737X488X821`Contributor`ilteen`spicePre`J`spiceSymbolName`5-146257-7`Manufacturer Part``~270~~gge3cc871da22d53932~2~41e24deddf2745f3af6274ac6eb8c761~1733755315~0~~yes~~#@$TRACK~0.197~12~~4203.7787 3148.0201 4224.9607 3148.0201 4224.9607 3077.6661 4203.7787 3077.6661 4203.7787 3148.0201~gge4864~0#@$TRACK~0.394~12~~4204.7637 3147.0361 4223.9757 3147.0361 4223.9757 3078.6501 4204.7637 3078.6501 4204.7637 3147.0361~gge4867~0#@$TEXT~P~4226.37~3112.843~0.6~270~1~4~~4.5~J2~M 4230.9097 3110.7931 L 4227.6397 3110.7931 L 4227.0197 3111.0031 L 4226.8197 3111.2031 L 4226.6197 3111.6131 L 4226.6197 3112.0231 L 4226.8197 3112.4331 L 4227.0197 3112.6431 L 4227.6397 3112.8431 L 4228.0497 3112.8431 M 4229.8897 3109.2431 L 4230.0897 3109.2431 L 4230.4997 3109.0431 L 4230.7097 3108.8331 L 4230.9097 3108.4231 L 4230.9097 3107.6031 L 4230.7097 3107.1931 L 4230.4997 3106.9931 L 4230.0897 3106.7931 L 4229.6797 3106.7931 L 4229.2697 3106.9931 L 4228.6597 3107.4031 L 4226.6197 3109.4431 L 4226.6197 3106.5831~none~gge4858~~0~#@$TEXT~N~4233.37~3112.843~0.6~270~1~4~~4.5~5-146257-7~M 4237.9097 3110.3931 L 4237.9097 3112.4331 L 4236.0697 3112.6431 L 4236.2697 3112.4331 L 4236.4797 3111.8231 L 4236.4797 3111.2031 L 4236.2697 3110.5931 L 4235.8697 3110.1831 L 4235.2497 3109.9831 L 4234.8397 3109.9831 L 4234.2297 3110.1831 L 4233.8197 3110.5931 L 4233.6197 3111.2031 L 4233.6197 3111.8231 L 4233.8197 3112.4331 L 4234.0197 3112.6431 L 4234.4297 3112.8431 M 4235.4597 3108.6331 L 4235.4597 3104.9431 M 4237.0897 3103.5931 L 4237.2997 3103.1931 L 4237.9097 3102.5731 L 4233.6197 3102.5731 M 4237.9097 3099.1831 L 4235.0497 3101.2231 L 4235.0497 3098.1531 M 4237.9097 3099.1831 L 4233.6197 3099.1831 M 4237.2997 3094.3531 L 4237.7097 3094.5531 L 4237.9097 3095.1731 L 4237.9097 3095.5831 L 4237.7097 3096.1931 L 4237.0897 3096.6031 L 4236.0697 3096.8031 L 4235.0497 3096.8031 L 4234.2297 3096.6031 L 4233.8197 3096.1931 L 4233.6197 3095.5831 L 4233.6197 3095.3731 L 4233.8197 3094.7631 L 4234.2297 3094.3531 L 4234.8397 3094.1431 L 4235.0497 3094.1431 L 4235.6597 3094.3531 L 4236.0697 3094.7631 L 4236.2697 3095.3731 L 4236.2697 3095.5831 L 4236.0697 3096.1931 L 4235.6597 3096.6031 L 4235.0497 3096.8031 M 4236.8897 3092.5931 L 4237.0897 3092.5931 L 4237.4997 3092.3931 L 4237.7097 3092.1831 L 4237.9097 3091.7731 L 4237.9097 3090.9531 L 4237.7097 3090.5431 L 4237.4997 3090.3431 L 4237.0897 3090.1431 L 4236.6797 3090.1431 L 4236.2697 3090.3431 L 4235.6597 3090.7531 L 4233.6197 3092.7931 L 4233.6197 3089.9331 M 4237.9097 3086.1331 L 4237.9097 3088.1731 L 4236.0697 3088.3831 L 4236.2697 3088.1731 L 4236.4797 3087.5631 L 4236.4797 3086.9431 L 4236.2697 3086.3331 L 4235.8697 3085.9231 L 4235.2497 3085.7231 L 4234.8397 3085.7231 L 4234.2297 3085.9231 L 4233.8197 3086.3331 L 4233.6197 3086.9431 L 4233.6197 3087.5631 L 4233.8197 3088.1731 L 4234.0197 3088.3831 L 4234.4297 3088.5831 M 4237.9097 3081.5031 L 4233.6197 3083.5531 M 4237.9097 3084.3731 L 4237.9097 3081.5031 M 4235.4597 3080.1531 L 4235.4597 3076.4731 M 4237.9097 3072.2631 L 4233.6197 3074.3031 M 4237.9097 3075.1231 L 4237.9097 3072.2631~none~gge4852~~0~#@$TRACK~0.787~4~~4209.3697 3147.6151 4204.7637 3147.6151 4204.7637 3078.0681 4223.9757 3078.0681 4223.9757 3142.8431~gge4870~0#@$PAD~RECT~4209.37~3142.843~6.791~6.791~11~2~1~2.264~4212.7652 3146.2386 4212.7652 3139.4476 4205.9742 3139.4476 4205.9742 3146.2386~270~gge4873~4.548~4209.3697 3142.8331 4209.3697 3142.8531~Y~0~0~0.2~4209.3697,3142.8431#@$PAD~ELLIPSE~4219.37~3142.843~6.791~6.791~11~1~2~2.264~~270~gge4888~4.548~4219.3697 3142.8331 4219.3697 3142.8531~Y~0~0~0.2~4219.3697,3142.8431#@$PAD~ELLIPSE~4209.37~3132.843~6.791~6.791~11~4~3~2.264~~270~gge4903~4.548~4209.3697 3132.8331 4209.3697 3132.8531~Y~0~0~0.2~4209.3697,3132.8431#@$PAD~ELLIPSE~4219.37~3132.843~6.791~6.791~11~3~4~2.264~~270~gge4918~4.548~4219.3697 3132.8331 4219.3697 3132.8531~Y~0~0~0.2~4219.3697,3132.8431#@$PAD~ELLIPSE~4209.37~3122.843~6.791~6.791~11~6~5~2.264~~270~gge4933~4.548~4209.3697 3122.8331 4209.3697 3122.8531~Y~0~0~0.2~4209.3697,3122.8431#@$PAD~ELLIPSE~4219.37~3122.843~6.791~6.791~11~5~6~2.264~~270~gge4948~4.548~4219.3697 3122.8331 4219.3697 3122.8531~Y~0~0~0.2~4219.3697,3122.8431#@$PAD~ELLIPSE~4209.37~3112.843~6.791~6.791~11~8~7~2.264~~270~gge4963~4.548~4209.3697 3112.8331 4209.3697 3112.8531~Y~0~0~0.2~4209.3697,3112.8431#@$PAD~ELLIPSE~4219.37~3112.843~6.791~6.791~11~7~8~2.264~~270~gge4978~4.548~4219.3697 3112.8331 4219.3697 3112.8531~Y~0~0~0.2~4219.3697,3112.8431#@$PAD~ELLIPSE~4209.37~3102.843~6.791~6.791~11~10~9~2.264~~270~gge4993~4.548~4209.3697 3102.8331 4209.3697 3102.8531~Y~0~0~0.2~4209.3697,3102.8431#@$PAD~ELLIPSE~4219.37~3102.843~6.791~6.791~11~9~10~2.264~~270~gge5008~4.548~4219.3697 3102.8331 4219.3697 3102.8531~Y~0~0~0.2~4219.3697,3102.8431#@$PAD~ELLIPSE~4209.37~3092.843~6.791~6.791~11~12~11~2.264~~270~gge5023~4.548~4209.3697 3092.8331 4209.3697 3092.8531~Y~0~0~0.2~4209.3697,3092.8431#@$PAD~ELLIPSE~4219.37~3092.843~6.791~6.791~11~11~12~2.264~~270~gge5038~4.548~4219.3697 3092.8331 4219.3697 3092.8531~Y~0~0~0.2~4219.3697,3092.8431#@$PAD~ELLIPSE~4209.37~3082.843~6.791~6.791~11~14~13~2.264~~270~gge5053~4.548~4209.3697 3082.8331 4209.3697 3082.8531~Y~0~0~0.2~4209.3697,3082.8431#@$PAD~ELLIPSE~4219.37~3082.843~6.791~6.791~11~13~14~2.264~~270~gge5068~4.548~4219.3697 3082.8331 4219.3697 3082.8531~Y~0~0~0.2~4219.3697,3082.8431", + "LIB~4086~3113~package`FTE-107-XX-G-DV`Contributor`ilteen`spicePre`J`spiceSymbolName`FTE-107-01-G-DV`Manufacturer Part``~90~~ggea695ea407efc1e40~1~3f6b82c427c54632a54eef039cc34a22~1733755249~0~~yes~~#@$TEXT~N~4063~3114~0.6~90~0~3~~4.5~FTE-107-01-G-DV~M 4058.46 3114 L 4062.75 3114 M 4058.46 3114 L 4058.46 3111.34 M 4060.5 3114 L 4060.5 3112.36 M 4058.46 3108.56 L 4062.75 3108.56 M 4058.46 3109.99 L 4058.46 3107.13 M 4058.46 3105.78 L 4062.75 3105.78 M 4058.46 3105.78 L 4058.46 3103.12 M 4060.5 3105.78 L 4060.5 3104.14 M 4062.75 3105.78 L 4062.75 3103.12 M 4060.91 3101.77 L 4060.91 3098.09 M 4059.28 3096.74 L 4059.07 3096.33 L 4058.46 3095.71 L 4062.75 3095.71 M 4058.46 3093.14 L 4058.66 3093.75 L 4059.28 3094.16 L 4060.3 3094.36 L 4060.91 3094.36 L 4061.94 3094.16 L 4062.55 3093.75 L 4062.75 3093.14 L 4062.75 3092.73 L 4062.55 3092.11 L 4061.94 3091.7 L 4060.91 3091.5 L 4060.3 3091.5 L 4059.28 3091.7 L 4058.66 3092.11 L 4058.46 3092.73 L 4058.46 3093.14 M 4058.46 3087.29 L 4062.75 3089.33 M 4058.46 3090.15 L 4058.46 3087.29 M 4060.91 3085.94 L 4060.91 3082.25 M 4058.46 3079.68 L 4058.66 3080.29 L 4059.28 3080.7 L 4060.3 3080.9 L 4060.91 3080.9 L 4061.94 3080.7 L 4062.55 3080.29 L 4062.75 3079.68 L 4062.75 3079.27 L 4062.55 3078.65 L 4061.94 3078.25 L 4060.91 3078.04 L 4060.3 3078.04 L 4059.28 3078.25 L 4058.66 3078.65 L 4058.46 3079.27 L 4058.46 3079.68 M 4059.28 3076.69 L 4059.07 3076.28 L 4058.46 3075.67 L 4062.75 3075.67 M 4060.91 3074.32 L 4060.91 3070.64 M 4059.48 3066.22 L 4059.07 3066.42 L 4058.66 3066.83 L 4058.46 3067.24 L 4058.46 3068.06 L 4058.66 3068.47 L 4059.07 3068.88 L 4059.48 3069.08 L 4060.1 3069.29 L 4061.12 3069.29 L 4061.73 3069.08 L 4062.14 3068.88 L 4062.55 3068.47 L 4062.75 3068.06 L 4062.75 3067.24 L 4062.55 3066.83 L 4062.14 3066.42 L 4061.73 3066.22 L 4061.12 3066.22 M 4061.12 3067.24 L 4061.12 3066.22 M 4060.91 3064.87 L 4060.91 3061.19 M 4058.46 3059.84 L 4062.75 3059.84 M 4058.46 3059.84 L 4058.46 3058.4 L 4058.66 3057.79 L 4059.07 3057.38 L 4059.48 3057.18 L 4060.1 3056.97 L 4061.12 3056.97 L 4061.73 3057.18 L 4062.14 3057.38 L 4062.55 3057.79 L 4062.75 3058.4 L 4062.75 3059.84 M 4058.46 3055.62 L 4062.75 3053.99 M 4058.46 3052.35 L 4062.75 3053.99~none~gge4615~~0~#@$TEXT~P~4070~3114~0.6~90~0~3~~4.5~J1~M 4065.46 3111.95 L 4068.73 3111.95 L 4069.35 3112.16 L 4069.55 3112.36 L 4069.75 3112.77 L 4069.75 3113.18 L 4069.55 3113.59 L 4069.35 3113.8 L 4068.73 3114 L 4068.32 3114 M 4066.28 3110.6 L 4066.07 3110.2 L 4065.46 3109.58 L 4069.75 3109.58~none~gge4621~~0~#@$TRACK~0.787~12~~4080 3124.024 4080 3101.976 4092 3101.976 4092 3124.024 4080 3124.024~gge4627~0#@$ARC~0.787~12~~M 4092.496 3125.598 A 0.197 0.197 0 1 0 4092.514 3125.599~~gge4630~0#@$TRACK~0.197~12~~4071.571 3130.126 4071.571 3097.252 4100.429 3097.252 4100.429 3130.126 4071.571 3130.126~gge4633~0#@$PAD~RECT~4092.496~3122.449~7.992~2~1~1~1~0~4096.492 3123.449 4088.5 3123.449 4088.5 3121.449 4096.492 3121.449~180~gge4636~0~~Y~0~0~0.2~4092.496,3122.449#@$PAD~RECT~4079.504~3122.449~7.992~2~1~2~2~0~4083.5 3123.449 4075.508 3123.449 4075.508 3121.449 4083.5 3121.449~180~gge4651~0~~Y~0~0~0.2~4079.504,3122.449#@$PAD~RECT~4092.496~3119.299~7.992~2~1~3~3~0~4096.492 3120.299 4088.5 3120.299 4088.5 3118.299 4096.492 3118.299~180~gge4666~0~~Y~0~0~0.2~4092.496,3119.299#@$PAD~RECT~4079.504~3119.299~7.992~2~1~4~4~0~4083.5 3120.299 4075.508 3120.299 4075.508 3118.299 4083.5 3118.299~180~gge4681~0~~Y~0~0~0.2~4079.504,3119.299#@$PAD~RECT~4092.496~3116.15~7.992~2~1~5~5~0~4096.492 3117.15 4088.5 3117.15 4088.5 3115.15 4096.492 3115.15~180~gge4696~0~~Y~0~0~0.2~4092.496,3116.15#@$PAD~RECT~4079.504~3116.15~7.992~2~1~6~6~0~4083.5 3117.15 4075.508 3117.15 4075.508 3115.15 4083.5 3115.15~180~gge4711~0~~Y~0~0~0.2~4079.504,3116.15#@$PAD~RECT~4092.496~3113~7.992~2~1~7~7~0~4096.492 3114 4088.5 3114 4088.5 3112 4096.492 3112~180~gge4726~0~~Y~0~0~0.2~4092.496,3113#@$PAD~RECT~4079.504~3113~7.992~2~1~8~8~0~4083.5 3114 4075.508 3114 4075.508 3112 4083.5 3112~180~gge4741~0~~Y~0~0~0.2~4079.504,3113#@$PAD~RECT~4092.496~3109.85~7.992~2~1~9~9~0~4096.492 3110.85 4088.5 3110.85 4088.5 3108.85 4096.492 3108.85~180~gge4756~0~~Y~0~0~0.2~4092.496,3109.85#@$PAD~RECT~4079.504~3109.85~7.992~2~1~10~10~0~4083.5 3110.85 4075.508 3110.85 4075.508 3108.85 4083.5 3108.85~180~gge4771~0~~Y~0~0~0.2~4079.504,3109.85#@$PAD~RECT~4092.496~3106.701~7.992~2~1~11~11~0~4096.492 3107.701 4088.5 3107.701 4088.5 3105.701 4096.492 3105.701~180~gge4786~0~~Y~0~0~0.2~4092.496,3106.701#@$PAD~RECT~4079.504~3106.701~7.992~2~1~12~12~0~4083.5 3107.701 4075.508 3107.701 4075.508 3105.701 4083.5 3105.701~180~gge4801~0~~Y~0~0~0.2~4079.504,3106.701#@$PAD~RECT~4092.496~3103.551~7.992~2~1~13~13~0~4096.492 3104.551 4088.5 3104.551 4088.5 3102.551 4096.492 3102.551~180~gge4816~0~~Y~0~0~0.2~4092.496,3103.551#@$PAD~RECT~4079.504~3103.551~7.992~2~1~14~14~0~4083.5 3104.551 4075.508 3104.551 4075.508 3102.551 4083.5 3102.551~180~gge4831~0~~Y~0~0~0.2~4079.504,3103.551", + "VIA~4085.354~3103.551~2.441~14~0.6102~gge5634~0", + "VIA~4085.354~3106.701~2.441~12~0.6102~gge5646~0", + "VIA~4085.354~3109.85~2.441~10~0.6102~gge5658~0", + "VIA~4085.354~3113~2.441~8~0.6102~gge5670~0", + "VIA~4085.354~3116.15~2.441~6~0.6102~gge5682~0", + "VIA~4085.354~3119.299~2.441~4~0.6102~gge5694~0", + "VIA~4085.354~3122.449~2.441~2~0.6102~gge5706~0" + ], + "layers": [ + "1~TopLayer~#FF0000~true~false~true~", + "2~BottomLayer~#0000FF~true~false~true~", + "3~TopSilkLayer~#FFCC00~true~false~true~", + "4~BottomSilkLayer~#66CC33~true~true~true~", + "5~TopPasteMaskLayer~#808080~false~false~true~", + "6~BottomPasteMaskLayer~#800000~false~false~true~", + "7~TopSolderMaskLayer~#800080~false~false~true~0.3", + "8~BottomSolderMaskLayer~#AA00FF~false~false~true~0.3", + "9~Ratlines~#6464FF~false~false~true~", + "10~BoardOutLine~#FF00FF~true~false~true~", + "11~Multi-Layer~#C0C0C0~true~false~true~", + "12~Document~#FFFFFF~false~false~true~", + "13~TopAssembly~#33CC99~false~false~false~", + "14~BottomAssembly~#5555FF~false~false~false~", + "15~Mechanical~#F022F0~false~false~false~", + "19~3DModel~#66CCFF~false~false~false~", + "21~Inner1~#999966~false~false~false~~", + "22~Inner2~#008000~false~false~false~~", + "23~Inner3~#00FF00~false~false~false~~", + "24~Inner4~#BC8E00~false~false~false~~", + "25~Inner5~#70DBFA~false~false~false~~", + "26~Inner6~#00CC66~false~false~false~~", + "27~Inner7~#9966FF~false~false~false~~", + "28~Inner8~#800080~false~false~false~~", + "29~Inner9~#008080~false~false~false~~", + "30~Inner10~#15935F~false~false~false~~", + "31~Inner11~#000080~false~false~false~~", + "32~Inner12~#00B400~false~false~false~~", + "33~Inner13~#2E4756~false~false~false~~", + "34~Inner14~#99842F~false~false~false~~", + "35~Inner15~#FFFFAA~false~false~false~~", + "36~Inner16~#99842F~false~false~false~~", + "37~Inner17~#2E4756~false~false~false~~", + "38~Inner18~#3535FF~false~false~false~~", + "39~Inner19~#8000BC~false~false~false~~", + "40~Inner20~#43AE5F~false~false~false~~", + "41~Inner21~#C3ECCE~false~false~false~~", + "42~Inner22~#728978~false~false~false~~", + "43~Inner23~#39503F~false~false~false~~", + "44~Inner24~#0C715D~false~false~false~~", + "45~Inner25~#5A8A80~false~false~false~~", + "46~Inner26~#2B937E~false~false~false~~", + "47~Inner27~#23999D~false~false~false~~", + "48~Inner28~#45B4E3~false~false~false~~", + "49~Inner29~#215DA1~false~false~false~~", + "50~Inner30~#4564D7~false~false~false~~", + "51~Inner31~#6969E9~false~false~false~~", + "52~Inner32~#9069E9~false~false~false~~", + "99~ComponentShapeLayer~#00CCCC~false~false~false~0.4", + "100~LeadShapeLayer~#CC9999~false~false~false~", + "101~ComponentMarkingLayer~#66FFCC~false~false~false~", + "Hole~Hole~#222222~false~false~true~", + "DRCError~DRCError~#FAD609~false~false~true~" + ], + "objects": [ + "All~true~false", + "Component~true~true", + "Prefix~true~true", + "Name~true~false", + "Track~true~true", + "Pad~true~true", + "Via~true~true", + "Hole~true~true", + "Copper_Area~true~true", + "Circle~true~true", + "Arc~true~true", + "Solid_Region~true~true", + "Text~true~true", + "Image~true~true", + "Rect~true~true", + "Dimension~true~true", + "Protractor~true~true" + ], + "BBox": { + "x": 4075.5, + "y": 3076.3, + "width": 155.5, + "height": 72.8 + }, + "preference": { + "hideFootprints": "", + "hideNets": "" + }, + "DRCRULE": { + "Default": { + "trackWidth": 1, + "clearance": 0.5984, + "viaHoleDiameter": 2.4016, + "viaHoleD": 1.2008 + }, + "isRealtime": true, + "isDrcOnRoutingOrPlaceVia": false, + "checkObjectToCopperarea": true, + "showDRCRangeLine": true + }, + "routerRule": { + "unit": "mm", + "trackWidth": 0.254, + "trackClearance": 0.152, + "viaHoleD": 0.305, + "viaDiameter": 0.61, + "routerLayers": [ + 1, + 2 + ], + "smdClearance": 0.152, + "specialNets": [ + { + "net": "1", + "width": "1px", + "clearance": "0.5984px", + "viaHoleD": "1.2008px", + "viaHoleDiameter": "2.4016px" + }, + { + "net": "2", + "width": "1px", + "clearance": "0.5984px", + "viaHoleD": "1.2008px", + "viaHoleDiameter": "2.4016px" + }, + { + "net": "3", + "width": "1px", + "clearance": "0.5984px", + "viaHoleD": "1.2008px", + "viaHoleDiameter": "2.4016px" + }, + { + "net": "4", + "width": "1px", + "clearance": "0.5984px", + "viaHoleD": "1.2008px", + "viaHoleDiameter": "2.4016px" + }, + { + "net": "5", + "width": "1px", + "clearance": "0.5984px", + "viaHoleD": "1.2008px", + "viaHoleDiameter": "2.4016px" + }, + { + "net": "6", + "width": "1px", + "clearance": "0.5984px", + "viaHoleD": "1.2008px", + "viaHoleDiameter": "2.4016px" + }, + { + "net": "7", + "width": "1px", + "clearance": "0.5984px", + "viaHoleD": "1.2008px", + "viaHoleDiameter": "2.4016px" + }, + { + "net": "8", + "width": "1px", + "clearance": "0.5984px", + "viaHoleD": "1.2008px", + "viaHoleDiameter": "2.4016px" + }, + { + "net": "9", + "width": "1px", + "clearance": "0.5984px", + "viaHoleD": "1.2008px", + "viaHoleDiameter": "2.4016px" + }, + { + "net": "10", + "width": "1px", + "clearance": "0.5984px", + "viaHoleD": "1.2008px", + "viaHoleDiameter": "2.4016px" + }, + { + "net": "11", + "width": "1px", + "clearance": "0.5984px", + "viaHoleD": "1.2008px", + "viaHoleDiameter": "2.4016px" + }, + { + "net": "12", + "width": "1px", + "clearance": "0.5984px", + "viaHoleD": "1.2008px", + "viaHoleDiameter": "2.4016px" + }, + { + "net": "13", + "width": "1px", + "clearance": "0.5984px", + "viaHoleD": "1.2008px", + "viaHoleDiameter": "2.4016px" + }, + { + "net": "14", + "width": "1px", + "clearance": "0.5984px", + "viaHoleD": "1.2008px", + "viaHoleDiameter": "2.4016px" + } + ], + "nets": [ + "1", + "10", + "11", + "12", + "13", + "14", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9" + ], + "padsCount": 28, + "skipNets": [], + "realtime": true + }, + "netColors": {} +} \ No newline at end of file diff --git a/doc/OpenEarable-PCB/OpenEarable-PCB-debugging-1.0/Schematic.pdf b/doc/OpenEarable-PCB/OpenEarable-PCB-debugging-1.0/Schematic.pdf new file mode 100644 index 00000000..f16eaa4d Binary files /dev/null and b/doc/OpenEarable-PCB/OpenEarable-PCB-debugging-1.0/Schematic.pdf differ diff --git a/doc/OpenEarable-PCB/OpenEarable-PCB-flex-2.0/OpenEarable-PCB-flex-2.0-BOM.xlsx b/doc/OpenEarable-PCB/OpenEarable-PCB-flex-2.0/OpenEarable-PCB-flex-2.0-BOM.xlsx new file mode 100644 index 00000000..d4d7d8b0 Binary files /dev/null and b/doc/OpenEarable-PCB/OpenEarable-PCB-flex-2.0/OpenEarable-PCB-flex-2.0-BOM.xlsx differ diff --git a/doc/OpenEarable-PCB/OpenEarable-PCB-flex-2.0/OpenEarable-PCB-flex-2.0-Layout.pdf b/doc/OpenEarable-PCB/OpenEarable-PCB-flex-2.0/OpenEarable-PCB-flex-2.0-Layout.pdf new file mode 100644 index 00000000..fb664429 Binary files /dev/null and b/doc/OpenEarable-PCB/OpenEarable-PCB-flex-2.0/OpenEarable-PCB-flex-2.0-Layout.pdf differ diff --git a/doc/OpenEarable-PCB/OpenEarable-PCB-flex-2.0/OpenEarable-PCB-flex-2.0-Schematic.pdf b/doc/OpenEarable-PCB/OpenEarable-PCB-flex-2.0/OpenEarable-PCB-flex-2.0-Schematic.pdf new file mode 100644 index 00000000..b743ab43 Binary files /dev/null and b/doc/OpenEarable-PCB/OpenEarable-PCB-flex-2.0/OpenEarable-PCB-flex-2.0-Schematic.pdf differ diff --git a/doc/OpenEarable-PCB/OpenEarable-PCB-flex-2.0/OpenEarable-PCB-flex-2.0.epro b/doc/OpenEarable-PCB/OpenEarable-PCB-flex-2.0/OpenEarable-PCB-flex-2.0.epro new file mode 100644 index 00000000..13c3d056 Binary files /dev/null and b/doc/OpenEarable-PCB/OpenEarable-PCB-flex-2.0/OpenEarable-PCB-flex-2.0.epro differ diff --git a/doc/OpenEarable-PCB/OpenEarable-PCB-main-2.0/OpenEarable-PCB-main-2.0-BOM.xlsx b/doc/OpenEarable-PCB/OpenEarable-PCB-main-2.0/OpenEarable-PCB-main-2.0-BOM.xlsx new file mode 100644 index 00000000..5b6e3ed3 Binary files /dev/null and b/doc/OpenEarable-PCB/OpenEarable-PCB-main-2.0/OpenEarable-PCB-main-2.0-BOM.xlsx differ diff --git a/doc/OpenEarable-PCB/OpenEarable-PCB-main-2.0/OpenEarable-PCB-main-2.0-Layout.pdf b/doc/OpenEarable-PCB/OpenEarable-PCB-main-2.0/OpenEarable-PCB-main-2.0-Layout.pdf new file mode 100644 index 00000000..b0bc84f1 Binary files /dev/null and b/doc/OpenEarable-PCB/OpenEarable-PCB-main-2.0/OpenEarable-PCB-main-2.0-Layout.pdf differ diff --git a/doc/OpenEarable-PCB/OpenEarable-PCB-main-2.0/OpenEarable-PCB-main-2.0-Schematic.pdf b/doc/OpenEarable-PCB/OpenEarable-PCB-main-2.0/OpenEarable-PCB-main-2.0-Schematic.pdf new file mode 100644 index 00000000..e95161aa Binary files /dev/null and b/doc/OpenEarable-PCB/OpenEarable-PCB-main-2.0/OpenEarable-PCB-main-2.0-Schematic.pdf differ diff --git a/doc/OpenEarable-PCB/OpenEarable-PCB-main-2.0/OpenEarable-PCB-main-2.0.epro b/doc/OpenEarable-PCB/OpenEarable-PCB-main-2.0/OpenEarable-PCB-main-2.0.epro new file mode 100644 index 00000000..27fb0954 Binary files /dev/null and b/doc/OpenEarable-PCB/OpenEarable-PCB-main-2.0/OpenEarable-PCB-main-2.0.epro differ diff --git a/doc/datasheets/ADAU1860.pdf b/doc/datasheets/ADAU1860.pdf new file mode 100644 index 00000000..5ff40d2d Binary files /dev/null and b/doc/datasheets/ADAU1860.pdf differ diff --git a/doc/datasheets/AP22916.pdf b/doc/datasheets/AP22916.pdf new file mode 100644 index 00000000..b3573ee2 Binary files /dev/null and b/doc/datasheets/AP22916.pdf differ diff --git a/doc/datasheets/BMA580.pdf b/doc/datasheets/BMA580.pdf new file mode 100644 index 00000000..4f7480ed Binary files /dev/null and b/doc/datasheets/BMA580.pdf differ diff --git a/doc/datasheets/BMP388.pdf b/doc/datasheets/BMP388.pdf new file mode 100644 index 00000000..2c73b72f Binary files /dev/null and b/doc/datasheets/BMP388.pdf differ diff --git a/doc/datasheets/BMX160.pdf b/doc/datasheets/BMX160.pdf new file mode 100644 index 00000000..f56176f3 Binary files /dev/null and b/doc/datasheets/BMX160.pdf differ diff --git a/doc/datasheets/BQ25120A.pdf b/doc/datasheets/BQ25120A.pdf new file mode 100644 index 00000000..8f3da3cb Binary files /dev/null and b/doc/datasheets/BQ25120A.pdf differ diff --git a/doc/datasheets/BQ27220.pdf b/doc/datasheets/BQ27220.pdf new file mode 100644 index 00000000..71928df3 Binary files /dev/null and b/doc/datasheets/BQ27220.pdf differ diff --git a/doc/datasheets/CSD13380F3T.pdf b/doc/datasheets/CSD13380F3T.pdf new file mode 100644 index 00000000..b35d2c32 Binary files /dev/null and b/doc/datasheets/CSD13380F3T.pdf differ diff --git a/doc/datasheets/CSD23382F4.pdf b/doc/datasheets/CSD23382F4.pdf new file mode 100644 index 00000000..dae4ca65 Binary files /dev/null and b/doc/datasheets/CSD23382F4.pdf differ diff --git a/doc/datasheets/KTD2026.pdf b/doc/datasheets/KTD2026.pdf new file mode 100644 index 00000000..1f530ba6 Binary files /dev/null and b/doc/datasheets/KTD2026.pdf differ diff --git a/doc/datasheets/MAXM86161.pdf b/doc/datasheets/MAXM86161.pdf new file mode 100644 index 00000000..93464ff9 Binary files /dev/null and b/doc/datasheets/MAXM86161.pdf differ diff --git a/doc/datasheets/MDBT53.pdf b/doc/datasheets/MDBT53.pdf new file mode 100644 index 00000000..bb4f3b91 Binary files /dev/null and b/doc/datasheets/MDBT53.pdf differ diff --git a/doc/datasheets/MLX90632.pdf b/doc/datasheets/MLX90632.pdf new file mode 100644 index 00000000..fe57e297 Binary files /dev/null and b/doc/datasheets/MLX90632.pdf differ diff --git a/doc/datasheets/MX25R6435F.pdf b/doc/datasheets/MX25R6435F.pdf new file mode 100644 index 00000000..96ccf052 Binary files /dev/null and b/doc/datasheets/MX25R6435F.pdf differ diff --git a/doc/datasheets/PRTR5V0U2F.pdf b/doc/datasheets/PRTR5V0U2F.pdf new file mode 100644 index 00000000..c4b6556b Binary files /dev/null and b/doc/datasheets/PRTR5V0U2F.pdf differ diff --git a/doc/datasheets/SN74AXC4T774.pdf b/doc/datasheets/SN74AXC4T774.pdf new file mode 100644 index 00000000..e5bc0778 Binary files /dev/null and b/doc/datasheets/SN74AXC4T774.pdf differ diff --git a/doc/datasheets/SPH0641LU4H-1.pdf b/doc/datasheets/SPH0641LU4H-1.pdf new file mode 100644 index 00000000..561155f9 Binary files /dev/null and b/doc/datasheets/SPH0641LU4H-1.pdf differ diff --git a/doc/datasheets/bq27220_tech_ref_sluubd4a.pdf b/doc/datasheets/bq27220_tech_ref_sluubd4a.pdf new file mode 100644 index 00000000..7e52c21f Binary files /dev/null and b/doc/datasheets/bq27220_tech_ref_sluubd4a.pdf differ diff --git a/doc/datasheets/nRF5340_Product_Specification.pdf b/doc/datasheets/nRF5340_Product_Specification.pdf new file mode 100644 index 00000000..f66256d1 Binary files /dev/null and b/doc/datasheets/nRF5340_Product_Specification.pdf differ diff --git a/doc/adapting_application.rst b/doc/nrf53_audio_app/adapting_application.rst similarity index 100% rename from doc/adapting_application.rst rename to doc/nrf53_audio_app/adapting_application.rst diff --git a/doc/building.rst b/doc/nrf53_audio_app/building.rst similarity index 94% rename from doc/building.rst rename to doc/nrf53_audio_app/building.rst index a946005b..538dc07c 100644 --- a/doc/building.rst +++ b/doc/nrf53_audio_app/building.rst @@ -97,7 +97,7 @@ The building command for running the script requires providing the following par - Specifies the application version. - ``release``, ``debug`` - | :ref:`nrf53_audio_app_configuration_files` - | **Note:** For FOTA DFU, you must use :ref:`nrf53_audio_app_building_standard`. + | * - Device type (``-d``) - Specifies the device type. - ``headset``, ``gateway``, ``both`` @@ -236,16 +236,11 @@ The application supports the following custom configurations: * - Debug (default) - :file:`prj.conf` - No suffix - - Debug version of the application. Provides full logging capabilities and debug optimizations to ease development. + - Debug version of the application with FOTA/DFU support. Provides full logging capabilities and debug optimizations to ease development. * - Release - :file:`prj_release.conf` - ``release`` - Release version of the application. Disables logging capabilities and disables development features to create a smaller application binary. - * - FOTA DFU - - :file:`prj_fota.conf` - - ``fota`` - - | Builds the debug version of the application with the features needed to perform DFU over Bluetooth LE, and includes bootloaders so that the applications on both the application core and network core can be updated. - | See :ref:`nrf53_audio_app_fota` for more information. Building the application ======================== @@ -278,18 +273,6 @@ Complete the following steps to build the application: This way, you can build firmware for headset and gateway to separate directories before programming the development kits. Alternatively, you can use the :ref:`nrf53_audio_app_building_script`, which handles this automatically. -Building the application for FOTA ---------------------------------- - -The following command example builds the application for :ref:`nrf53_audio_app_fota`: - -.. code-block:: console - - west build -b nrf5340_audio_dk/nrf5340/cpuapp --pristine -- -DCONFIG_AUDIO_DEV=1 -DFILE_SUFFIX=fota - -The command uses ``-DFILE_SUFFIX=fota`` to pick :file:`prj_fota.conf` instead of the default :file:`prj.conf`. -It also uses the ``--pristine`` to clean the existing directory before starting the build process. - Programming the application =========================== diff --git a/doc/configuration.rst b/doc/nrf53_audio_app/configuration.rst similarity index 100% rename from doc/configuration.rst rename to doc/nrf53_audio_app/configuration.rst diff --git a/doc/feature_support.rst b/doc/nrf53_audio_app/feature_support.rst similarity index 100% rename from doc/feature_support.rst rename to doc/nrf53_audio_app/feature_support.rst diff --git a/doc/firmware_architecture.rst b/doc/nrf53_audio_app/firmware_architecture.rst similarity index 100% rename from doc/firmware_architecture.rst rename to doc/nrf53_audio_app/firmware_architecture.rst diff --git a/doc/fota.rst b/doc/nrf53_audio_app/fota.rst similarity index 100% rename from doc/fota.rst rename to doc/nrf53_audio_app/fota.rst diff --git a/index.rst b/doc/nrf53_audio_app/index.rst similarity index 100% rename from index.rst rename to doc/nrf53_audio_app/index.rst diff --git a/doc/requirements.rst b/doc/nrf53_audio_app/requirements.rst similarity index 81% rename from doc/requirements.rst rename to doc/nrf53_audio_app/requirements.rst index 00f79e41..d8c99977 100644 --- a/doc/requirements.rst +++ b/doc/nrf53_audio_app/requirements.rst @@ -55,13 +55,8 @@ These files change the configuration defaults automatically, based on the differ For each application, only one of the following :file:`.conf` files is included when building: -* :file:`prj.conf` is the default configuration file and it implements the debug application version. +* :file:`prj.conf` is the default configuration file. It implements the debug application version with FOTA/DFU support included. * :file:`prj_release.conf` is the optional configuration file and it implements the release application version. No debug features are enabled in the release application version. When building using the command line, you must explicitly specify if :file:`prj_release.conf` is going to be included instead of :file:`prj.conf`. See :ref:`nrf53_audio_app_building` for details. -* :file:`prj_fota.conf` is the optional configuration file used for FOTA DFU. - When used, the build system builds the debug version of the application (:file:`prj.conf`), but with the features needed to perform DFU over Bluetooth LE. - It also includes bootloaders so that the applications on both the application core and network core can be updated. - When building using the command line, you must explicitly specify if :file:`prj_fota.conf` is going to be included instead of :file:`prj.conf`. - See :ref:`nrf53_audio_app_fota` for more information. diff --git a/doc/user_interface.rst b/doc/nrf53_audio_app/user_interface.rst similarity index 100% rename from doc/user_interface.rst rename to doc/nrf53_audio_app/user_interface.rst