{"id":51240138,"url":"https://github.com/petronijus/nexusq-reloaded","last_synced_at":"2026-06-29T00:00:22.430Z","repository":{"id":365962961,"uuid":"1166970266","full_name":"petronijus/nexusQ-reloaded","owner":"petronijus","description":"postmarketOS port of the Google Nexus Q (steelhead) on a mainline Linux 6.12 kernel — TI OMAP4460","archived":false,"fork":false,"pushed_at":"2026-06-19T17:22:45.000Z","size":1155,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-19T17:33:16.231Z","etag":null,"topics":["arm","device-port","linux-kernel","mainline-linux","nexus-q","omap4","postmarketos"],"latest_commit_sha":null,"homepage":null,"language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/petronijus.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","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-02-25T20:07:29.000Z","updated_at":"2026-06-19T17:22:49.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/petronijus/nexusQ-reloaded","commit_stats":null,"previous_names":["petronijus/nexusq-reloaded"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/petronijus/nexusQ-reloaded","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/petronijus%2FnexusQ-reloaded","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/petronijus%2FnexusQ-reloaded/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/petronijus%2FnexusQ-reloaded/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/petronijus%2FnexusQ-reloaded/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/petronijus","download_url":"https://codeload.github.com/petronijus/nexusQ-reloaded/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/petronijus%2FnexusQ-reloaded/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34907985,"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-28T02:00:05.809Z","response_time":54,"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":["arm","device-port","linux-kernel","mainline-linux","nexus-q","omap4","postmarketos"],"created_at":"2026-06-29T00:00:21.614Z","updated_at":"2026-06-29T00:00:22.422Z","avatar_url":"https://github.com/petronijus.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Nexus Q Reloaded -- postmarketOS Port\n\nPort of the Google Nexus Q (codename **steelhead**) to postmarketOS using a\nmainline Linux 6.12 LTS kernel.\n\n## Hardware\n\n| Component | Chip | Driver | Bus |\n|-----------|------|--------|-----|\n| SoC | TI OMAP4460 (Cortex-A9 x2) | omap4 | - |\n| Audio Codec | TI TWL6040 | snd-soc-omap-abe-twl6040 | McPDM (I2C1) |\n| Audio Amp | TI TAS5713 25W Class-D | snd-soc-tas571x | McBSP2 (I2C4) |\n| WiFi | Broadcom BCM4330 | brcmfmac | SDIO (MMC5) |\n| Bluetooth | Broadcom BCM4330 | hci_bcm | UART2 |\n| NFC | NXP PN544 | pn544_i2c | I2C3 |\n| Ethernet | SMSC LAN9500A | smsc95xx | USB EHCI |\n| HDMI | OMAP4 DSS + TPD12S015A | omapdrm | DSS |\n| LEDs | AVR MCU + LP5523 | leds-lp5523 | I2C2 |\n| PMIC | TI TWL6030 | twl-core | I2C1 |\n\n## Status\n\n**postmarketOS (systemd) boots; the device is daily-usable.** SSH over USB gadget\nand WiFi (BCM4330), HDMI desktop, TAS5713 amp, LED ring + rotary keys, and a full\nhost-built rootfs. Since the 2026-06-10 snapshot below, several \"dead\" verdicts were\noverturned:\n\n- **Dual-core SMP works** (since v1.2.0; re-confirmed `nproc=2` on 2026-06-28) —\n  the old \"single-core, SMP disabled\" status is obsolete.\n- **CPU frequency scaling 350→1200 MHz** (v1.4.0), governor `conservative`.\n- **On-board Ethernet (LAN9500A) is NOT dead hardware** — fixed in v1.1.0/v1.3.0;\n  currently **down again** on cpufreq builds (a v1.4.0 boot-timing regression, fix\n  tracked for 1.4.1), not a hardware fault.\n- The shipping kernel is built with **GCC 15.2** (Alpine, via pmbootstrap) and\n  boots — the historical \"GCC 13.3.Rel1 only\" constraint applied to an early\n  hand-cross-compiled build, not this path.\n- **armv7 python3 works on the device (v1.6.0, flash-verified).** The long-standing\n  crash (`python3 -S -c ''` → rc 139 in `Py_Initialize`, taking down `onboard` /\n  `blueman` / `sleep-inhibitor` / `gdb`) was a **flash bug, not a build bug**:\n  `raw2simg.py` emitted all-zero blocks as `DONT_CARE`, which the Nexus Q's non-erasing\n  U-Boot left as **stale eMMC data**, re-corrupting libpython's should-be-zero regions\n  on-device — fixed by writing a **byte-exact all-RAW sparse**. v1.6.0 ships a plain\n  default-linker (bfd) `python3` rebuild that supersedes Alpine's broken `-r2`, with a\n  build-integrity gate (`scripts/verify-libpython-clean.py`) + ship gate kept as a\n  safety net. (A qemu-user build-corruption theory and a gold-linker workaround were\n  tried and **dropped as unnecessary** — 6/6 default-linker builds were gate-clean.)\n  Verified on a fresh flash (no live-patch): `libpython3.14.so.1.0` md5\n  `79a0d4ace1358bb2d94c8a4d72479da9`, `python3` rc 0. See `CHANGELOG.md` and\n  `docs/2026-06-28-session-findings.md`.\n\nSee `CHANGELOG.md` for the per-milestone record and `HANDOFF.md` for technical\nnotes and root-cause analysis.\nSee `PLAN.md` for the hardware status map and the prioritized roadmap\n(TAS5713 amplifier first).\n\n## Quick Start\n\n```bash\n# Build inside Docker\n./docker-build.sh\n\n# Or: build boot image manually (requires arm-none-eabi-gcc cross compiler)\n# See docker-build.sh for the full build procedure\n```\n\n## Project Structure\n\n```\nkernel/\n  dts/omap4-steelhead.dts          Device tree source\n  configs/steelhead_defconfig      Kernel configuration\n  patches/0001-*.patch             TAS5713 driver support\n  patches/0002-*.patch             TAS5713 DT binding\n  patches/0003-*.patch             Steelhead DTS in kernel tree\npmos/\n  device-google-steelhead/         postmarketOS device package\n  linux-google-steelhead/          postmarketOS kernel package\n  firmware-google-steelhead/       BCM4330 firmware package\nbuild-and-flash.sh                 Automated build and flash script\n```\n\n## Flashing\n\nThe Nexus Q has hardware-triggered fastboot mode (cover mute LED during\npower-on). The device is **unbrickable** as long as the `bootloader`\npartition is never overwritten.\n\n### Partition Layout\n\n| Partition | Size | Usage |\n|-----------|------|-------|\n| boot | 8 MB | Kernel + embedded initramfs + DTB (6.7 MB fits) |\n| system | 1 GB | Not used (too small for rootfs) |\n| userdata | 13 GB | **Rootfs target** |\n\n### Flash Commands\n\n```bash\n# Flash kernel to boot partition (ramdisk-less, must fit the 8 MB boot partition):\nfastboot flash boot output/nexusq-boot-v1.6.0.img\n\n# Flash rootfs to userdata partition. The -S 100M chunking is REQUIRED: the 2012\n# U-Boot has a ~150 MB download buffer and fails SILENTLY on a larger blob.\n# The v1.6.0 sparse is all-RAW (byte-exact) -- U-Boot never erases userdata, so the\n# image must write every block (zeros included), not skip them as DONT_CARE.\nfastboot -S 100M flash userdata output/nexusq-rootfs-v1.6.0-sparse.img\n\n# Then power-cycle WITHOUT holding mute sensor to boot normally.\n```\n\n**IMPORTANT:**\n- Always do a **full power cycle** (unplug power) between flash operations\n- **Do NOT use `fastboot boot`** (RAM boot) -- it is unreliable on this U-Boot\n- NEVER flash the `bootloader` partition\n\n## Testing Pipeline\n\n1. `make dtbs_check` -- validate device tree\n2. `pmbootstrap kconfig check` -- validate kernel config\n3. `pmbootstrap build` -- cross-compile\n4. `pmbootstrap qemu` -- QEMU boot test (vexpress-a9)\n5. `fastboot flash boot nexusq-boot-v*.img` -- flash kernel (ramdisk-less, \u003c=8 MB)\n6. `fastboot -S 100M flash userdata nexusq-rootfs-v*-sparse.img` -- flash rootfs\n\n## Releases\n\nVersioning is tag-only (milestone-based). Images are built locally (the kernel\nand rootfs aren't built in GitHub CI) and attached to the GitHub release:\n\n- `nexusq-boot-vX.Y.Z.img` -- kernel + initramfs boot image\n- `nexusq-rootfs-vX.Y.Z-sparse.img` -- postmarketOS rootfs (Android sparse)\n\nEnd-user flashing is in [INSTALL.md](INSTALL.md); build steps in `HANDOFF.md`;\nversion history in [CHANGELOG.md](CHANGELOG.md).\n\n## License\n\n[GPL-2.0](LICENSE) -- this repository carries Linux kernel patches, a device\ntree and a defconfig, which are derivative works of the Linux kernel (GPLv2).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpetronijus%2Fnexusq-reloaded","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpetronijus%2Fnexusq-reloaded","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpetronijus%2Fnexusq-reloaded/lists"}