LinHT

Open-source hardware, Linux-based, SDR handheld transceiver. OpenHT successor with greatly simplified hardware - no FPGAs involved. This project offers a replacement board for the Retevis C62 radio, greatly expanding its capabilities.
Hardware
The device uses an MCM-iMX93 System on Module (SoM) running Linux. The RF front-end is based on the Semtech SX1255. The chip is used as a complete IQ modulator/demodulator, allowing for true all-mode support.
Resources
CPU:
- Dual-core ARM Cortex-A55 @ 1.7GHz
- ARM Cortex-M33 coprocessor @ 250MHz
- Floating Point Unit
- ARM Ethos U-65 microNPU (Neural Processing Unit with TensorFlow Lite support)
Memory:
- 2GB LPDDR4
- 32GB eMMC
- 500kHz bandwidth complete IQ transceiver
Software
Developers can use C/C++/Python as well as (or in conjunction with) GNU Radio flowgraphs. Tools such as gcc are built-in.
Supported modes (so far):
- FM transmission and reception with pre-/de-emphasis and CTCSS
- SSB transmission and reception
- M17 - transmission and reception
- TETRA - reception only
- Demo 64QAM transmission at 2Mbps
Other modes can be added later (FreeDV, APRS, etc.).
Images
Prebuilt images for LinHT can be downloaded here.
Building images
Instructions for setting up the Yocto build environment can be found on here.
Flashing
Standard: using the Universal Update Utility (uuu)
To flash the images to LinHT, the Universal Update Utility is needed. LinHT needs to be booted into flash mode (holding the secondary side button while booting). Once in flash mode, plug in the USB-C cable, then the image can be written with uuu:
uuu -v -b emmc_all imx-boot-mcm-imx93-sd.bin-flash_singleboot linht-image-mcm-imx93.rootfs.wic.zst
Alternative: mounting the eMMC drive
Sometimes, the uuu tool fails to flash the image. It will then exit at 15% (or at some other point) with libusb returning error -1 or -9. Luckily, there is another way to flash the device. Its eMMC drive can be mounted using debug UART exposed at the Kenwood connector. The connection parameters are as follows: 115200 baud, 8 bits, no parity, 1 stop bit, CR-LF line ending.
After putting the LinHT into USB boot mode (and USB-C plugged in), connect a USB-UART converter (3.3V logic!) at the Kenwood connector. Issue a U-boot command to mount the eMMC drive:
ums 0 mmc 0
A new drive should appear (looking like an external flash drive). Then, a tool like dd or Rufus (under Windows) can be used to flash the image:
zstdcat /path/to/image.wic.zst | sudo dd of=/dev/sdX bs=1M status=progress
where /dev/sdX is the eMMC's mounting point.
Updating the image
To update the image, use SSH to execute
fw_setenv bootcmd "setenv bootcmd '`fw_printenv -n bootcmd`'; saveenv; ums 0 mmc 0"
then
reboot now
This command tells U-boot to mount the eMMC drive at next boot. The device will reboot. It is now possible to use dd or Rufus with the freshly mounted eMMC to flash the Linux image (see above). After flashing, unmount the drive and reset the device to complete the process. The bootcmd variable will automatically be overwritten with its original contents, such that after reset the device will boot Linux normally.
Driver
To access LinHTs network device under windows, RNDIS driver need to be installed. You can use for example this one (Not provided by the LinHT team! Use at your own risk!)
It should work on most Linux distributions out of the box!
Links
How-tos
Blogs
Presentations
LinHT – a GNU Radio configurable handheld transceiver (en), Wojciech Kaczmarski (SP5WWP), M17 Conference 2025
LinHT: open-source SDR transceiver (cz), Vlastimil Slinták (OK5VAS), OpenAlt 2025
Repositories
Hardware
Main LinHT-hw: LinHT hardware repository
LinHT-rf-amp: GRF5604 Test board
Software
LinHT-utils: Collection of LinHT tools, scripts and flowgraphs
Yocto layer
meta-linht-software: Installed software, configuration, ...
meta-linht-hardware: Device Tree, driver, ...
meta-linht-sdr: GNU Radio packages
License
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
CC BY-NC-SA 4.0