{"id":50757239,"url":"https://github.com/opensensor/atbm-cli","last_synced_at":"2026-06-11T06:03:12.213Z","repository":{"id":360828362,"uuid":"1251871350","full_name":"opensensor/atbm-cli","owner":"opensensor","description":null,"archived":false,"fork":false,"pushed_at":"2026-05-28T04:07:57.000Z","size":357,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-28T04:08:05.345Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/opensensor.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-28T01:39:02.000Z","updated_at":"2026-05-28T04:08:00.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/opensensor/atbm-cli","commit_stats":null,"previous_names":["opensensor/atbm-cli"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/opensensor/atbm-cli","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/opensensor%2Fatbm-cli","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/opensensor%2Fatbm-cli/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/opensensor%2Fatbm-cli/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/opensensor%2Fatbm-cli/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/opensensor","download_url":"https://codeload.github.com/opensensor/atbm-cli/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/opensensor%2Fatbm-cli/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34184780,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-11T02:00:06.485Z","response_time":57,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-06-11T06:03:11.421Z","updated_at":"2026-06-11T06:03:12.208Z","avatar_url":"https://github.com/opensensor.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# atbm-cli — ATBM6441 Firmware Burn Tool\n\nCross-platform CLI tool for flashing firmware to AltoBeam ATBM6441 WiFi IoT chips via UART. Replaces the Windows-only Altobem WIFI IOT GUI with a simple, scriptable command-line interface.\n\n## Overview\n\n| Feature | Description |\n|---|---|\n| **Platform** | Linux, macOS, Windows (any OS with serial port access) |\n| **Transport** | UART over USB-serial (FT232, CP2102, etc.) |\n| **Baud rates** | 115200, 1000000, 1500000 |\n| **Dependencies** | `pyserial`, `tqdm` — zero proprietary DLLs |\n| **Protocol** | AT commands (`AT+START`, `AT+SEND`, `AT+REBOOT`) |\n\n## Installation\n\n```bash\npip install -e .\n# or with dev deps\npip install -e \".[dev]\"\n```\n\n## Quick Start\n\n```bash\n# Query chip info\natbm6441-cli info --port /dev/ttyUSB0 gmr\n\n# Burn firmware\natbm6441-cli burn --port /dev/ttyUSB0 --baud 1000000 \\\n  --firmware fw_update1.bin \\\n  --flashcode fw_update2.bin \\\n  --bootloader bootloader_step1.bin\n\n# Burn KEY data\natbm6441-cli key --port /dev/ttyUSB0 --keyfile keys.csv\n\n# Read/write memory\natbm6441-cli mem r 0x16a00020 --port /dev/ttyUSB0\natbm6441-cli mem w 0x100000 0xDEADBEEF --port /dev/ttyUSB0\n\n# Read flash content\natbm6441-cli read --port /dev/ttyUSB0 --addr 0x000000 --len 0x100000 output.bin\n\n# Verify burned firmware\natbm6441-cli verify --port /dev/ttyUSB0 --firmware fw_update1.bin\n```\n\n## Commands\n\n### `burn` — Flash firmware images\n\nBurns bootloader, CODE1 (ICCM), CODE2 (Flash), and KEY data in sequence.\n\n```bash\natbm6441-cli burn \\\n  --port /dev/ttyUSB0 \\\n  --baud 1000000 \\\n  --firmware fw_update1.bin \\\n  --flashcode fw_update2.bin \\\n  --bootloader bootloader_step1.bin \\\n  --keyfile keys.csv \\\n  --mac aa:bb:cc:dd:ee:ff\n```\n\n| Flag | Description | Default |\n|---|---|---|\n| `--port`, `-p` | Serial port | auto-detect |\n| `--auto-detect` | Scan for FT232/USB-serial device | — |\n| `--baud`, `-b` | Burn baud rate | 1000000 |\n| `--at-baud` | AT command baud rate | 115200 |\n| `--boot-timeout` | Seconds to wait for bootloader prompt/mode banner | 30 |\n| `--send-timeout` | Seconds to wait for each firmware transfer response | 120 |\n| `--packet-delay-ms` | Pause between raw `fwupdata` packets | 0 |\n| `--skip-zero-chunks` | Skip all-zero raw `fwupdata` chunks for sparse patch burns | — |\n| `--firmware`, `-f` | CODE1 firmware (fw_update1.bin) | optional |\n| `--bootloader`, `-F` | Bootloader image | optional |\n| `--flashcode` | CODE2 flash image (fw_update2.bin) | optional |\n| `--keyfile` | KEY file (CSV/TXT) | optional |\n| `--mac` | MAC address to burn | optional |\n| `--manual-mode` | Assume the chip is already at the raw bootloader prompt and use `fwupdata` | — |\n| `--no-reboot` | Do not reboot/boot after download | — |\n| `--serial-monitor` | Mirror bootloader TX/RX to stderr | — |\n| `--json` | JSON output mode | — |\n| `--log-level`, `-l` | Log level (debug/info/warn/error) | info |\n\n### No-reboot firmware patch helper\n\nThe helper below patches known reset/WDT reboot paths in a corrected\nlittle-endian flash dump and emits both a full image and bootloader burn images.\nIt also recalculates the `fw_update2` trailer checksum after patching.\nIt does not require committing firmware blobs to git.\n\n```bash\npython tools/patch_no_reboot.py firmware_dump_le.bin\n\natbm6441-cli burn --manual-mode --no-reboot --serial-monitor \\\n  --port COM6 \\\n  --firmware firmware_analysis/code1_original.bin \\\n  --flashcode firmware_analysis/code2_no_reboot.bin\n```\n\n### `key` — Burn KEY data\n\nBurns encryption keys from a CSV or hex string file to flash.\n\n```bash\natbm6441-cli key \\\n  --port /dev/ttyUSB0 \\\n  --keyfile keys.csv \\\n  --key1-addr 0x008000 \\\n  --key2-addr 0x101000\n```\n\n### `info` — Query chip information\n\nSends AT commands to query chip version, SDK version, and firmware info.\n\n```bash\n# All queries\natbm6441-cli info --port /dev/ttyUSB0 all\n\n# Specific query\natbm6441-cli info --port /dev/ttyUSB0 gmr\natbm6441-cli info --port /dev/ttyUSB0 sdk\natbm6441-cli info --port /dev/ttyUSB0 venver\natbm6441-cli info --port /dev/ttyUSB0 status\n```\n\n| Command | AT Command | Description |\n|---|---|---|\n| `gmr` | `AT+GMR` | Modem info |\n| `sdk` | `AT+GET_SDK_VER` | SDK version |\n| `venver` | `AT+VENVER` | Hardware version |\n| `fwinfo` | `AT+WIFI_GET_FWINFO` | Firmware info |\n| `status` | `AT+WIFI_STATUS` | WiFi status |\n\n### `mem` — Read/write memory\n\nReads or writes 32-bit values to chip memory via AT commands.\n\n```bash\n# Read memory\natbm6441-cli mem r 0x16a00020 --length 4 --port /dev/ttyUSB0\n\n# Write memory\natbm6441-cli mem w 0x100000 0xDEADBEEF --port /dev/ttyUSB0\n```\n\n### `read` — Read flash content\n\nReads flash content from the chip and saves to a file.\n\n```bash\natbm6441-cli read \\\n  --port /dev/ttyUSB0 \\\n  --addr 0x000000 \\\n  --len 0x100000 \\\n  output.bin\n```\n\n### `verify` — Verify burned firmware\n\nReads back flash and compares checksums against the original binary.\n\n```bash\natbm6441-cli verify \\\n  --port /dev/ttyUSB0 \\\n  --firmware fw_update1.bin\n```\n\n### `chip` — Chip information\n\nQueries chip ID and version.\n\n```bash\natbm6441-cli chip info --port /dev/ttyUSB0\natbm6441-cli chip flash-id --port /dev/ttyUSB0\n```\n\n## Firmware Image Layout\n\nThe ATBM6441 bootloader expects firmware images at specific flash addresses:\n\n| Component | Address | Max Size | Description |\n|---|---|---|---|\n| Bootloader | `0x000000` | 48 KB | `bootloader_step1.bin` |\n| KEY1 data | `0x008000` | — | Encryption key (key1) |\n| KEY2 data | `0x101000` | — | Encryption key (key2) |\n| CODE1 (ICCM) | `0x010000` | ~2 MB | `fw_update1.bin` — main firmware |\n| CODE2 (Flash) | `0x040000` | ~2 MB | `fw_update2.bin` — flash/AP data |\n| Userdata | `0x400000–0x600000` | — | MAC, efuse, calibration |\n\n## Protocol Details\n\n### UART Configuration\n\n| Setting | Value |\n|---|---|\n| Port | Configurable (e.g. `/dev/ttyUSB0`, `COM3`) |\n| Baud rate | 1,000,000 (burn) or 115,200 (AT commands) |\n| Data bits | 8 |\n| Parity | None |\n| Stop bits | 1 |\n\n### Boot Mode Sequence\n\n1. Open UART at 1,000,000 baud\n2. Send `AT+START\\r\\n` → chip enters bootloader mode\n3. Wait for `[ bootloader mode ]` response\n4. Send `AT+SEND\\r\\n` → chip expects firmware data\n5. Send firmware binary in 1024-byte chunks\n6. Wait for `\u003c\u003c\u003c download SUCCESS \u003e\u003e\u003e` response\n7. Send `AT+REBOOT\\r\\n` → chip reboots with new firmware\n\n### AT Commands\n\n| Command | Purpose |\n|---|---|\n| `AT+START` | Enter bootloader mode |\n| `AT+SEND` | Start firmware data transfer |\n| `AT+REBOOT` | Reboot chip after burn |\n| `AT+wmem \u003caddr\u003e \u003cvalue\u003e` | Write 32-bit value to memory |\n| `AT+WIFI_ETF_RMEM \u003caddr\u003e \u003clen\u003e` | Read bytes from memory |\n| `AT+GMR` | Get modem info |\n| `AT+GET_SDK_VER` | Get SDK version |\n| `AT+VENVER` | Get hardware version |\n| `AT+PRINT 0/1` | Enable/disable verbose output |\n| `AT+WIFI_GET_FWINFO` | Get firmware info |\n\n### Flash Register Addresses\n\n| Address | Purpose |\n|---|---|\n| `0x16100008` | Reset control (0 = reset, 0xFFFFFFFF = release) |\n| `0x16100074` | AHB read/write target |\n| `0x1610007c` | AHB control |\n| `0x161000ac` | Config register |\n| `0x16101000` | Config register |\n| `0x1610102c` | Config register |\n| `0x16a00020`–`0x16a00040` | Chip version / ID registers |\n| `0xacc0178` | Clock config (0x3400071) |\n\n## Testing\n\n```bash\n# Run all tests\npython -m pytest tests/ -v\n\n# Run unit tests only (no integration)\npython -m pytest tests/ -v -m \"not integration\"\n\n# Run with coverage\npython -m pytest tests/ -v --cov=atbm6441_cli --cov-report=term-missing\n```\n\n## Development\n\n### Project Structure\n\n```\natbm6441-cli/\n├── src/atbm6441_cli/\n│   ├── cli/\n│   │   ├── __init__.py      # Entry point, argparse dispatch\n│   │   └── commands/\n│   │       ├── burn.py      # burn command\n│   │       ├── key.py       # key command\n│   │       ├── info.py      # info command\n│   │       ├── mem.py       # mem command\n│   │       ├── read.py      # read command\n│   │       ├── verify.py    # verify command\n│   │       └── chip.py      # chip command\n│   ├── protocol/\n│   │   ├── bootloader.py    # AT command protocol\n│   │   ├── uart.py          # Serial port management\n│   │   ├── flash_id.py      # JEDEC ID discovery\n│   │   └── flash_reader.py  # Chunked flash read\n│   ├── config.py            # INI-based config\n│   └── utils/\n│       └── logging.py       # Structured logging\n├── tests/\n│   ├── test_bootloader.py   # Protocol tests\n│   ├── test_uart.py         # Serial tests\n│   ├── test_cli.py          # CLI tests\n│   └── test_config.py       # Config tests\n├── pyproject.toml\n└── README.md\n```\n\n### Adding a New Command\n\n1. Create `src/atbm6441_cli/cli_commands/newcmd.py` with `newcmd_parser()` and `newcmd_handler()`\n2. Import and register in `src/atbm6441_cli/cli/__init__.py`\n3. Add tests in `tests/test_newcmd.py`\n\n## Success Criteria\n\n- [x] Can flash bootloader + CODE1 + CODE2 via UART at 1M baud\n- [x] Verified firmware boots correctly after burn\n- [x] Can read chip ID and firmware version\n- [x] Can read/write flash at arbitrary addresses\n- [x] Works without any proprietary DLLs\n- [x] Exit codes and JSON output for CI integration\n- [ ] Burn time \u003c 30s for 1M image (pending hardware testing)\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fopensensor%2Fatbm-cli","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fopensensor%2Fatbm-cli","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fopensensor%2Fatbm-cli/lists"}