HackerGadgets' uConsole Upgrade Kit - adding NVME SSD(PCIe), RJ45 Ethernet and USB 3.0 to your Uconsole

Hello Vileer! Quick question…I am on the Radxa CM5 with the AIO v2 and NVME board. After extensive custom patches and kernel mods on the Arch build floating around, I’ve managed to get everything working EXCEPT the PCIe. SDR, Lora, GPS, USB 3.0, proper full shutdown, power management…but after 3 known working NVME drives and several random adapters, LTSSM is always stuck at 0x3. I can paste my project log in trying to get this to work…can you shed some light on this? Session Log: PCIe/NVMe Fix Attempts — 2026-03-12

Starting State

  • Device: uConsole with Radxa CM5 (RK3588S), Arch Linux ARM, BSP kernel 6.1.84
  • PCIe controller: pcie2x1l2 @ fe190000, CombPHY0 @ fee00000
  • Symptom: LTSSM stuck at 0x3 (Polling.Active) — root complex detects endpoint, sends TS1 training sequences, never receives valid TS2 back
  • USB 3.0: working. Ethernet: working. Only PCIe/NVMe remains broken.

What was done this session

  1. Identified combphy driver is built-in (=y), not a module
  • CONFIG_PHY_ROCKCHIP_NANENG_COMBO_PHY=y in .config
  • Previous suggestion of “just swap the .ko file” was wrong — there IS no .ko
  • Must rebuild full kernel Image to change combphy behavior
  1. Fetched mainline combphy driver from torvalds/linux master
  • Sparse-cloned drivers/phy/rockchip/phy-rockchip-naneng-combphy.c
  • Did line-by-line diff of rk3588_combphy_cfg() between BSP 6.1.84 and mainline
  1. Identified specific register value differences for PCIe 100MHz path

┌─────────────────┬─────────┬───────────┬──────────────────────┬─────────────────────┐
│ Register │ Address │ BSP Value │ Mainline Value │ Purpose │
├─────────────────┼─────────┼───────────┼──────────────────────┼─────────────────────┤
│ su_trim[7:0] │ 0x28 │ 0x90 │ 0xF0 │ PLL tuning │
├─────────────────┼─────────┼───────────┼──────────────────────┼─────────────────────┤
│ PLL LPF │ 0x2c │ 0x43 │ 0x04 │ PLL loop filter │
├─────────────────┼─────────┼───────────┼──────────────────────┼─────────────────────┤
│ PHYREG13 │ 0x30 │ 0x88 │ not written │ Extra BSP write │
├─────────────────┼─────────┼───────────┼──────────────────────┼─────────────────────┤
│ PHYREG14 │ 0x34 │ 0x56 │ not written │ Extra BSP write │
├─────────────────┼─────────┼───────────┼──────────────────────┼─────────────────────┤
│ gate_tx_pck_sel │ 0x74 │ 0xc0 │ not written │ L1SS (BSP only) │
├─────────────────┼─────────┼───────────┼──────────────────────┼─────────────────────┤
│ SSC direction │ 0x7c │ BIT(4) │ not written for PCIe │ SSC disabled anyway │
├─────────────────┼─────────┼───────────┼──────────────────────┼─────────────────────┤
│ PLL KVCO │ 0x80 │ 4 │ 4 │ Same │
├─────────────────┼─────────┼───────────┼──────────────────────┼─────────────────────┤
│ rx_trim │ 0x6c │ 0x4c │ 0x4c │ Same │
└─────────────────┴─────────┴───────────┴──────────────────────┴─────────────────────┘

  1. Identified structural differences NOT patched
  • Mainline uses priv->type vs BSP priv->mode (field rename)
  • Mainline stores priv->refclk, priv->id, priv->enable_ssc, priv->ext_refclk in struct
  • Mainline adds PHY-ID-based mux selection (pipe_pcie1l0_sel/pipe_pcie1l1_sel) — but this only triggers for PHY IDs 1 and 2. This device uses combphy0 (ID 0), so the mux fix is NOT relevant
    here.
  • Mainline removed force_det_out, pipe_phy_grf_reset, pcie1ln-sel-bits DT handling
  • Mainline changed reset from get_optional(“combphy”) to get_exclusive(“phy”) with fallback
  • BSP has separate rockchip_combphy_pcie_init wrapper — mainline doesn’t
  1. Applied patch to device (SSH to 192.168.1.146)
  • Backed up original: phy-rockchip-naneng-combphy.c.bak
  • Edit 1: Removed SSC direction write from PCIe case (line 1212-1213)
  • Edit 2: Replaced 100MHz PCIe block — removed gate_tx_pck_sel, changed su_trim from 0x90→0xF0, changed PLL LPF from 0x43→0x04, removed PHYREG13/14 writes
  • Verified both edits applied correctly via sed -n reads
  1. Built kernel natively on device
  • Native gcc 15.2.1 on aarch64 (cross-compiler not installed)
  • make ARCH=arm64 -j4 Image modules
  • Had to install cpio package (missing dependency for kheaders)
  • Had to clean stale .o.d files from killed previous builds
  • Build succeeded: 6.1.84-gc1945a11d0b4-dirty
  1. Deployed and rebooted
  • sudo make ARCH=arm64 modules_install
  • sudo cp arch/arm64/boot/Image /boot/vmlinuz-linux-uconsole
  • sudo mkinitcpio -k 6.1.84-gc1945a11d0b4-dirty -g /boot/initramfs-linux-uconsole.img
  • Warning about missing crypto_lz4 module (non-critical, rootfs is ext4)
  • sudo reboot
  1. Result: LTSSM still 0x3. Patch did NOT fix it.
  • New kernel confirmed running: uname -r = 6.1.84-gc1945a11d0b4-dirty
  • GRF registers confirmed combphy code executed: con0=0x1000, con2=0x101
  • Ethernet confirmed still working: “Link is Up - 1Gbps/Full”
  • PCIe identical failure: PCIe Link Fail, LTSSM is 0x3
  1. Added to failed-approaches.md as item #21

Research findings this session

Confirmed: Daniel_Ueki’s NVMe success is RPi CM5, NOT Radxa CM5

  • Post #834 mentions “CM5 lite 16GB” and “EEPROM” boot order
  • Radxa CM5 has no EEPROM — only RPi CM5 does
  • Trinity (post #891) “NVMe works fine with CM5” — also RPi CM5 (confirmed from post #852)

Confirmed: No verified Radxa CM5 NVMe success found anywhere

  • Rex’s Bookworm 6.1.y thread for Radxa CM5: zero mentions of NVMe/PCIe on page 1 or 2
  • Rex’s Bookworm 6.12.y thread: PCIe enabled for RPi CM5 adapter boards
  • “Radxa CM5 on uConsole, tell your experience” thread: zero NVMe/PCIe mentions
  • “Anyone tried the Radxa CM5 on the uconsole?” thread: perillamint (post #9) notes Radxa CM5 “has an extra PCIe lane broken out” but no NVMe success reported
  • dev-null2019/radxa-cm5-uconsole GitHub: lists what works (display, keyboard, USB, power, 4G, microSD) — NVMe/PCIe NOT listed
  • clockworkpi/uConsole official GitHub: no Radxa CM5 device tree files at all
  • idjibb (post #899, March 10): asking for Radxa AIO v2 documentation, can’t find GPIO mappings
  • Rex (page 2): confirms “The script from hackergadgets was made for the RPi CMs” and “The Radxa CMs don’t use pinctrl”

Hackergadgets adapter board

  • Product page confirms Radxa CM5 variant exists and claims to “expose the PCIe” signals
  • No schematic, no FPC pinout, no PCIe routing documentation available
  • The RPi CM4/CM5 variant has confirmed NVMe — the Radxa CM5 variant does NOT have confirmed NVMe from any user
  • Downloaded Radxa CM5 v2.21 schematic PDF (saved locally) — needs poppler to read for PCIe pin mapping on B2B connector

Radxa CM5 PCIe architecture

  • 2x PCIe 2.0 1-lane: one shared with USB3+SATA (combphy2), one shared with SATA (combphy0)
  • combphy0 → pcie2x1l2 is the lane that should go to NVMe
  • combphy2 → USB3 (currently working, confirmed Bus 004 at 5000M)

What is now known / ruled out

  1. PLL tuning values (su_trim, PLL LPF) are NOT the root cause
  2. SSC direction write is NOT the root cause
  3. gate_tx_pck_sel is NOT the root cause
  4. All GRF register configuration is confirmed correct
  5. The combphy driver executes and configures the PHY — the configuration itself isn’t the problem
  6. LTSSM 0x3 = Polling.Active = endpoint detected, but no valid TS2 response
  7. No one has publicly confirmed NVMe working on Radxa CM5 + hackergadgets adapter board
  8. All NVMe successes in the forum are RPi CM5 users

Unresolved questions

  1. Does the hackergadgets Radxa CM5 adapter board actually route PCIe differential pairs to the FPC connector?
  2. Does the FPC cable carry the PCIe signals to the NVMe battery board?
  3. Which specific pins on the Radxa CM5 B2B connector carry pcie2x1l2 TX/RX? (Schematic downloaded but unread)
  4. Has vileer (hackergadgets) actually tested PCIe on the Radxa variant?
  5. Is there a power rail issue specific to the Radxa adapter board path?
  6. Could forcing Gen 1 (2.5 GT/s) help if the signal path is marginal?
  7. What do the remaining mainline structural changes (init sequence, reset handling) do differently?
2 Likes

Hailo is probably not worth it. LLM8850 is great but you need to manage the thermals.

1 Like

I use Rex’s Radxa image; the NVMe works out of the box. Maybe you can try that one.

Just ordered the upgrade kit with the Radxa version adapter board, along with AIO V2. Does anyone have experience with it, while recommending a propper image for installing the hackergadgets-aio-board package? My previous experience was that on RPi CM4, the package has dependencies that have contradictions with those on Debian12 (Bookworm), while on Debian13 (Trixie) it was butter smooth.

How about the remaining functions (SDR, GPS, LoRa, etc)? How were they test tested? How do we even know they work?

Hi, I have a question about antennas and power on device. From my experience I know I should not power any device if antennas are not on. What about uConsole? Can I power on with no antennas? Asking here because ordered aiov2 and I wonder now is it safe to power on? What happen if I turn off gps or Lora using command line ?

GPS and SDR you don’t need connected Wi-Fi and lora you need to, unless you have the v2 board then you just need a lora antenna connected before you turn the lora chip on.

1 Like

Ok, been trying to get Rex’s image working to test if I can get any NVMe working on any Radxa image. I was using it about six months ago when I first got mine but never got the NVMe working and figured it was the ribbon cables, so sent in for some replacements from you and then forgot about it, but once they showed up I started tinkering again and keep hitting a brick wall with this…bought a new Crucial P310 and booted the Bookworm image, same alternating 0x0 to 0x2 failure as my Arch build. The link fails, PCIe power domain stays off, root sends TS1, endpoint never sends TS2 back. seven different drives tested and some weird adapters I have lying around, all giving similar errors…am I just having insanely bad luck with drive compatibility? Can I ask a few questions: 1) what NVMe drive are you using? 2) are you using the radxa adapter board with the radxa cm5? I remember your reddit post last year announcing NVMe/Radxa compatibility, but you were still using the RPi adapter board for testing with the Radxa CM5. Only other thing I can think of is differences in lane routing at the adapter board or my board being defective. Any thoughts from you (or Rex)?

OMG. Nevermind. I have had the absolute worst draw of drives apparently. On a whim I pulled apart my homelab and tried the last m.2 drive I had (a fanxiang) and it worked on my Arch build right on boot…I can’t believe I wasted like three months chasing this down and didn’t try literally the last drive left in my house.

Hey man,Really like what you’ve built here — great work. Could you please let me know if shipping to Russia is available? I’d love to grab the full V2 kit, including the CM5 adapter board and NVMe. Appreciate it!:::

Hello all, I have received my uconsole and all my hacker gadget parts. The hacker gadget stuff shipped in February so I assume I do not need to make any changes to it.

My first question for now is which operating system we’ll give me the best option of using all the hacker gadget tools available on these boards.

Also what is the RPITX antenna port used for? Where would I add an antenna to it?

Id suggest Debian Trixie or Dragon OS for the distro.

If you’re not sure what the rpitx is for you won’t need to worry about it.

1 Like

the rpitx port is for GitHub - F5OEO/rpitx: RF transmitter for Raspberry Pi · GitHub
I think that’s a cm4 only feature, the cm5 gpio is too different for it to still work

Here is my next question, I hope a simple one. How would you change this antenna layout?

Are these larger WiFi antennas good? I was thinking on connected to the CM5 WiFi and the other to the AC1200 card.

I have not wired any so totally open to changing them.

Good afternoon! I recently wrote about my fork of rpitx-ui, and I thought it might be of interest to you. Among the most important updates are the migration to CMake and fixes for the SSB modulation mode.

More details: Reddit - The heart of the internet

CMake may be a newer build system but that does not make it better. It’s more complex and less widely supported, and veteran C programmers tend not to use it for that reason and that it abstracts out the actual compiler calls and replaces them with an opaque configuration syntax. Within the context of this specific project, all of the dependencies use Makefiles, so you’re less consistent with the tools you’re using.

Also I really don’t want to learn yet another programming language just to contribute C code…

1 Like

Thanks for the feedback! I understand your preference for raw Makefiles.

However, CMake is essentially the industry standard for new development right now. The main goal wasn’t just to fix the currently broken rpitx build process, but to also make it stable and easily maintainable in the future. The original Makefiles were fragile and prone to breaking on newer Raspberry Pi OS releases (like Trixie), whereas CMake provides a much more robust build pipeline. I also added GitHub Actions so users can easily check the build status on GitHub before building it on real hardware.

Also, you don’t really need to learn CMake to contribute C code! If you write a new module, you just add the .c filename to the source list in CMakeLists.txt.

Ultimately, it comes down to a practical choice: you can either stick with the original upstream rpitx (which currently fails to build and requires you to fix the build issues manually), or use this rpitx-ui fork where all the build problems are already resolved out of the box, alongside some extra bug fixes (like SSB operation).

2 Likes

What are you guys finding is the least problematic OS to use with the aio2 board? Im going to assume it’s trixi. Does anyone know if DragonOS is just as stable as trixi? Im about to put an antena cover on the top so its going to make swapping SD cards a nightmare. I tried Kali first and that was super buggy. Wondering if I would he better off putting the kali tools I need on DragonOS or putting everything from Dragon and kali on a basic trixi image?

Thanks in advance!

I know this is a dumb question. I’m prepping to do this upgrade now and I’m wondering how folks found it best to load the OS on the NVME. Is there a process that worked well?

THANK YOU!

Easiest way without additional hardware is to boot with an SD card and then just flash the NVME while the uConsole is booted off the SD.
You can also use the USB C port on the hackergadgets adapter and RPiboot to flash the NVME from another machine.
I personally use an external NVME enclosure to flash the image to it from my main rig. Then just stuck the nvme back in the uConsole.

3 Likes