Repository files navigation

libhackrfk

Kotlin driver for the HackRF SDR (HackRF One, Jawbreaker, rad1o), speaking the libhackrf USB host protocol over the Android USB host API. Pure Kotlin — no NDK, no native libraries, no root. Built for Android but the wire codec is Android-free and JVM-testable.

Maintained by Isak — PU3IAR. Brought to you by id.qsl.br, a platform with tools for amateur radio operators. YouTube: @qraisak

Features

  • HackRfProtocol — the libhackrf wire codec, free of any Android dependency and unit-tested on the JVM:
    • Vendor request ids and payload encodings: frequency (MHz+Hz little-endian split), fractional sample rate (2–20 Msps) with the matching MAX2837 baseband filter selection, transceiver modes.
    • Gain rules exactly as the reference: LNA 0–40 dB in 8 dB steps, VGA 0–62 dB in 2 dB steps, TXVGA 0–47 dB, drive-scale mapping.
    • Signed 8-bit IQ sample conversion and the sweep block format (0x7F7F marker + u64 LE tuned frequency).
  • HackRfClient — USB transport and streaming lifecycle:
    • Device identity (VID 0x1d50), permission handling, RX streaming from the bulk-IN endpoint delivered as FloatArray (i0,q0,… in [-1,1]) with an optional power spectrum, through the same callback contract as the other iSDR clients.
    • Half-duplex TX: direct RX↔TX mode switches (never through OFF, which would drop the bias tee and RF amp), front-end state re-asserted across switches, and the transmit queue streamed to the bulk-OUT endpoint.
    • Firmware-driven sweep for wideband spectrum scans, with block reassembly and marker resynchronization.
    • setFrequency / setSampleRate / setLnaGain / setVgaGain / setAmpEnable / setAntennaPower, and TX: setTxVgaGain / setPtt / submitTxIq; sweep: startSweep / stopSweep.
  • TxInterpolator — polyphase Blackman-sinc interpolation raising the 48 kS/s modulator IQ to the board rate with unit DC gain per branch.

Testing without hardware

The wire codec and the interpolator are pinned by JVM contract tests in the parent project (isdr: HackRfProtocolTest, TxInterpolatorTest) — byte-exact payloads, filter and gain rules, sweep block parsing, and the measured spectral contract of the TX interpolation, all validated against the reference sources.

Credits and references

Faithful port of the reference host library and firmware semantics:

Request semantics, mode-switch behaviour and streaming alignment follow the hackrf_usb firmware sources and the libhackrf host library.

License

Dual-licensed — GPLv2+ only as part of the iSDR Drivers application; all other rights reserved. See LICENSE. The upstream libhackrf BSD 3-clause notice is retained there and in COPYING.md. Kotlin port © 2026 Isak Ruas isakruas@gmail.com.

About

Kotlin HackRF driver over the Android USB host API — pure Kotlin, JVM-testable wire codec.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

libhackrfk

Kotlin driver for the HackRF SDR (HackRF One, Jawbreaker, rad1o), speaking the libhackrf USB host protocol over the Android USB host API. Pure Kotlin — no NDK, no native libraries, no root. Built for Android but the wire codec is Android-free and JVM-testable.

Maintained by Isak — PU3IAR. Brought to you by id.qsl.br, a platform with tools for amateur radio operators. YouTube: @qraisak

Features

  • HackRfProtocol — the libhackrf wire codec, free of any Android dependency and unit-tested on the JVM:
    • Vendor request ids and payload encodings: frequency (MHz+Hz little-endian split), fractional sample rate (2–20 Msps) with the matching MAX2837 baseband filter selection, transceiver modes.
    • Gain rules exactly as the reference: LNA 0–40 dB in 8 dB steps, VGA 0–62 dB in 2 dB steps, TXVGA 0–47 dB, drive-scale mapping.
    • Signed 8-bit IQ sample conversion and the sweep block format (0x7F7F marker + u64 LE tuned frequency).
  • HackRfClient — USB transport and streaming lifecycle:
    • Device identity (VID 0x1d50), permission handling, RX streaming from the bulk-IN endpoint delivered as FloatArray (i0,q0,… in [-1,1]) with an optional power spectrum, through the same callback contract as the other iSDR clients.
    • Half-duplex TX: direct RX↔TX mode switches (never through OFF, which would drop the bias tee and RF amp), front-end state re-asserted across switches, and the transmit queue streamed to the bulk-OUT endpoint.
    • Firmware-driven sweep for wideband spectrum scans, with block reassembly and marker resynchronization.
    • setFrequency / setSampleRate / setLnaGain / setVgaGain / setAmpEnable / setAntennaPower, and TX: setTxVgaGain / setPtt / submitTxIq; sweep: startSweep / stopSweep.
  • TxInterpolator — polyphase Blackman-sinc interpolation raising the 48 kS/s modulator IQ to the board rate with unit DC gain per branch.

Testing without hardware

The wire codec and the interpolator are pinned by JVM contract tests in the parent project (isdr: HackRfProtocolTest, TxInterpolatorTest) — byte-exact payloads, filter and gain rules, sweep block parsing, and the measured spectral contract of the TX interpolation, all validated against the reference sources.

Credits and references

Faithful port of the reference host library and firmware semantics:

Request semantics, mode-switch behaviour and streaming alignment follow the hackrf_usb firmware sources and the libhackrf host library.

License

Dual-licensed — GPLv2+ only as part of the iSDR Drivers application; all other rights reserved. See LICENSE. The upstream libhackrf BSD 3-clause notice is retained there and in COPYING.md. Kotlin port © 2026 Isak Ruas isakruas@gmail.com.

About

Kotlin HackRF driver over the Android USB host API — pure Kotlin, JVM-testable wire codec.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

libhackrfk

Kotlin driver for the HackRF SDR (HackRF One, Jawbreaker, rad1o), speaking the libhackrf USB host protocol over the Android USB host API. Pure Kotlin — no NDK, no native libraries, no root. Built for Android but the wire codec is Android-free and JVM-testable.

Maintained by Isak — PU3IAR. Brought to you by id.qsl.br, a platform with tools for amateur radio operators. YouTube: @qraisak

Features

  • HackRfProtocol — the libhackrf wire codec, free of any Android dependency and unit-tested on the JVM:
    • Vendor request ids and payload encodings: frequency (MHz+Hz little-endian split), fractional sample rate (2–20 Msps) with the matching MAX2837 baseband filter selection, transceiver modes.
    • Gain rules exactly as the reference: LNA 0–40 dB in 8 dB steps, VGA 0–62 dB in 2 dB steps, TXVGA 0–47 dB, drive-scale mapping.
    • Signed 8-bit IQ sample conversion and the sweep block format (0x7F7F marker + u64 LE tuned frequency).
  • HackRfClient — USB transport and streaming lifecycle:
    • Device identity (VID 0x1d50), permission handling, RX streaming from the bulk-IN endpoint delivered as FloatArray (i0,q0,… in [-1,1]) with an optional power spectrum, through the same callback contract as the other iSDR clients.
    • Half-duplex TX: direct RX↔TX mode switches (never through OFF, which would drop the bias tee and RF amp), front-end state re-asserted across switches, and the transmit queue streamed to the bulk-OUT endpoint.
    • Firmware-driven sweep for wideband spectrum scans, with block reassembly and marker resynchronization.
    • setFrequency / setSampleRate / setLnaGain / setVgaGain / setAmpEnable / setAntennaPower, and TX: setTxVgaGain / setPtt / submitTxIq; sweep: startSweep / stopSweep.
  • TxInterpolator — polyphase Blackman-sinc interpolation raising the 48 kS/s modulator IQ to the board rate with unit DC gain per branch.

Testing without hardware

The wire codec and the interpolator are pinned by JVM contract tests in the parent project (isdr: HackRfProtocolTest, TxInterpolatorTest) — byte-exact payloads, filter and gain rules, sweep block parsing, and the measured spectral contract of the TX interpolation, all validated against the reference sources.

Credits and references

Faithful port of the reference host library and firmware semantics:

Request semantics, mode-switch behaviour and streaming alignment follow the hackrf_usb firmware sources and the libhackrf host library.

License

Dual-licensed — GPLv2+ only as part of the iSDR Drivers application; all other rights reserved. See LICENSE. The upstream libhackrf BSD 3-clause notice is retained there and in COPYING.md. Kotlin port © 2026 Isak Ruas isakruas@gmail.com.

About

Kotlin HackRF driver over the Android USB host API — pure Kotlin, JVM-testable wire codec.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

libhackrfk

Kotlin driver for the HackRF SDR (HackRF One, Jawbreaker, rad1o), speaking the libhackrf USB host protocol over the Android USB host API. Pure Kotlin — no NDK, no native libraries, no root. Built for Android but the wire codec is Android-free and JVM-testable.

Maintained by Isak — PU3IAR. Brought to you by id.qsl.br, a platform with tools for amateur radio operators. YouTube: @qraisak

Features

  • HackRfProtocol — the libhackrf wire codec, free of any Android dependency and unit-tested on the JVM:
    • Vendor request ids and payload encodings: frequency (MHz+Hz little-endian split), fractional sample rate (2–20 Msps) with the matching MAX2837 baseband filter selection, transceiver modes.
    • Gain rules exactly as the reference: LNA 0–40 dB in 8 dB steps, VGA 0–62 dB in 2 dB steps, TXVGA 0–47 dB, drive-scale mapping.
    • Signed 8-bit IQ sample conversion and the sweep block format (0x7F7F marker + u64 LE tuned frequency).
  • HackRfClient — USB transport and streaming lifecycle:
    • Device identity (VID 0x1d50), permission handling, RX streaming from the bulk-IN endpoint delivered as FloatArray (i0,q0,… in [-1,1]) with an optional power spectrum, through the same callback contract as the other iSDR clients.
    • Half-duplex TX: direct RX↔TX mode switches (never through OFF, which would drop the bias tee and RF amp), front-end state re-asserted across switches, and the transmit queue streamed to the bulk-OUT endpoint.
    • Firmware-driven sweep for wideband spectrum scans, with block reassembly and marker resynchronization.
    • setFrequency / setSampleRate / setLnaGain / setVgaGain / setAmpEnable / setAntennaPower, and TX: setTxVgaGain / setPtt / submitTxIq; sweep: startSweep / stopSweep.
  • TxInterpolator — polyphase Blackman-sinc interpolation raising the 48 kS/s modulator IQ to the board rate with unit DC gain per branch.

Testing without hardware

The wire codec and the interpolator are pinned by JVM contract tests in the parent project (isdr: HackRfProtocolTest, TxInterpolatorTest) — byte-exact payloads, filter and gain rules, sweep block parsing, and the measured spectral contract of the TX interpolation, all validated against the reference sources.

Credits and references

Faithful port of the reference host library and firmware semantics:

Request semantics, mode-switch behaviour and streaming alignment follow the hackrf_usb firmware sources and the libhackrf host library.

License

Dual-licensed — GPLv2+ only as part of the iSDR Drivers application; all other rights reserved. See LICENSE. The upstream libhackrf BSD 3-clause notice is retained there and in COPYING.md. Kotlin port © 2026 Isak Ruas isakruas@gmail.com.

About

Kotlin HackRF driver over the Android USB host API — pure Kotlin, JVM-testable wire codec.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

libhackrfk

Kotlin driver for the HackRF SDR (HackRF One, Jawbreaker, rad1o), speaking the libhackrf USB host protocol over the Android USB host API. Pure Kotlin — no NDK, no native libraries, no root. Built for Android but the wire codec is Android-free and JVM-testable.

Maintained by Isak — PU3IAR. Brought to you by id.qsl.br, a platform with tools for amateur radio operators. YouTube: @qraisak

Features

  • HackRfProtocol — the libhackrf wire codec, free of any Android dependency and unit-tested on the JVM:
    • Vendor request ids and payload encodings: frequency (MHz+Hz little-endian split), fractional sample rate (2–20 Msps) with the matching MAX2837 baseband filter selection, transceiver modes.
    • Gain rules exactly as the reference: LNA 0–40 dB in 8 dB steps, VGA 0–62 dB in 2 dB steps, TXVGA 0–47 dB, drive-scale mapping.
    • Signed 8-bit IQ sample conversion and the sweep block format (0x7F7F marker + u64 LE tuned frequency).
  • HackRfClient — USB transport and streaming lifecycle:
    • Device identity (VID 0x1d50), permission handling, RX streaming from the bulk-IN endpoint delivered as FloatArray (i0,q0,… in [-1,1]) with an optional power spectrum, through the same callback contract as the other iSDR clients.
    • Half-duplex TX: direct RX↔TX mode switches (never through OFF, which would drop the bias tee and RF amp), front-end state re-asserted across switches, and the transmit queue streamed to the bulk-OUT endpoint.
    • Firmware-driven sweep for wideband spectrum scans, with block reassembly and marker resynchronization.
    • setFrequency / setSampleRate / setLnaGain / setVgaGain / setAmpEnable / setAntennaPower, and TX: setTxVgaGain / setPtt / submitTxIq; sweep: startSweep / stopSweep.
  • TxInterpolator — polyphase Blackman-sinc interpolation raising the 48 kS/s modulator IQ to the board rate with unit DC gain per branch.

Testing without hardware

The wire codec and the interpolator are pinned by JVM contract tests in the parent project (isdr: HackRfProtocolTest, TxInterpolatorTest) — byte-exact payloads, filter and gain rules, sweep block parsing, and the measured spectral contract of the TX interpolation, all validated against the reference sources.

Credits and references

Faithful port of the reference host library and firmware semantics:

Request semantics, mode-switch behaviour and streaming alignment follow the hackrf_usb firmware sources and the libhackrf host library.

License

Dual-licensed — GPLv2+ only as part of the iSDR Drivers application; all other rights reserved. See LICENSE. The upstream libhackrf BSD 3-clause notice is retained there and in COPYING.md. Kotlin port © 2026 Isak Ruas isakruas@gmail.com.

About

Kotlin HackRF driver over the Android USB host API — pure Kotlin, JVM-testable wire codec.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

libhackrfk

Kotlin driver for the HackRF SDR (HackRF One, Jawbreaker, rad1o), speaking the libhackrf USB host protocol over the Android USB host API. Pure Kotlin — no NDK, no native libraries, no root. Built for Android but the wire codec is Android-free and JVM-testable.

Maintained by Isak — PU3IAR. Brought to you by id.qsl.br, a platform with tools for amateur radio operators. YouTube: @qraisak

Features

  • HackRfProtocol — the libhackrf wire codec, free of any Android dependency and unit-tested on the JVM:
    • Vendor request ids and payload encodings: frequency (MHz+Hz little-endian split), fractional sample rate (2–20 Msps) with the matching MAX2837 baseband filter selection, transceiver modes.
    • Gain rules exactly as the reference: LNA 0–40 dB in 8 dB steps, VGA 0–62 dB in 2 dB steps, TXVGA 0–47 dB, drive-scale mapping.
    • Signed 8-bit IQ sample conversion and the sweep block format (0x7F7F marker + u64 LE tuned frequency).
  • HackRfClient — USB transport and streaming lifecycle:
    • Device identity (VID 0x1d50), permission handling, RX streaming from the bulk-IN endpoint delivered as FloatArray (i0,q0,… in [-1,1]) with an optional power spectrum, through the same callback contract as the other iSDR clients.
    • Half-duplex TX: direct RX↔TX mode switches (never through OFF, which would drop the bias tee and RF amp), front-end state re-asserted across switches, and the transmit queue streamed to the bulk-OUT endpoint.
    • Firmware-driven sweep for wideband spectrum scans, with block reassembly and marker resynchronization.
    • setFrequency / setSampleRate / setLnaGain / setVgaGain / setAmpEnable / setAntennaPower, and TX: setTxVgaGain / setPtt / submitTxIq; sweep: startSweep / stopSweep.
  • TxInterpolator — polyphase Blackman-sinc interpolation raising the 48 kS/s modulator IQ to the board rate with unit DC gain per branch.

Testing without hardware

The wire codec and the interpolator are pinned by JVM contract tests in the parent project (isdr: HackRfProtocolTest, TxInterpolatorTest) — byte-exact payloads, filter and gain rules, sweep block parsing, and the measured spectral contract of the TX interpolation, all validated against the reference sources.

Credits and references

Faithful port of the reference host library and firmware semantics:

Request semantics, mode-switch behaviour and streaming alignment follow the hackrf_usb firmware sources and the libhackrf host library.

License

Dual-licensed — GPLv2+ only as part of the iSDR Drivers application; all other rights reserved. See LICENSE. The upstream libhackrf BSD 3-clause notice is retained there and in COPYING.md. Kotlin port © 2026 Isak Ruas isakruas@gmail.com.

About

Kotlin HackRF driver over the Android USB host API — pure Kotlin, JVM-testable wire codec.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

libhackrfk

Kotlin driver for the HackRF SDR (HackRF One, Jawbreaker, rad1o), speaking the libhackrf USB host protocol over the Android USB host API. Pure Kotlin — no NDK, no native libraries, no root. Built for Android but the wire codec is Android-free and JVM-testable.

Maintained by Isak — PU3IAR. Brought to you by id.qsl.br, a platform with tools for amateur radio operators. YouTube: @qraisak

Features

  • HackRfProtocol — the libhackrf wire codec, free of any Android dependency and unit-tested on the JVM:
    • Vendor request ids and payload encodings: frequency (MHz+Hz little-endian split), fractional sample rate (2–20 Msps) with the matching MAX2837 baseband filter selection, transceiver modes.
    • Gain rules exactly as the reference: LNA 0–40 dB in 8 dB steps, VGA 0–62 dB in 2 dB steps, TXVGA 0–47 dB, drive-scale mapping.
    • Signed 8-bit IQ sample conversion and the sweep block format (0x7F7F marker + u64 LE tuned frequency).
  • HackRfClient — USB transport and streaming lifecycle:
    • Device identity (VID 0x1d50), permission handling, RX streaming from the bulk-IN endpoint delivered as FloatArray (i0,q0,… in [-1,1]) with an optional power spectrum, through the same callback contract as the other iSDR clients.
    • Half-duplex TX: direct RX↔TX mode switches (never through OFF, which would drop the bias tee and RF amp), front-end state re-asserted across switches, and the transmit queue streamed to the bulk-OUT endpoint.
    • Firmware-driven sweep for wideband spectrum scans, with block reassembly and marker resynchronization.
    • setFrequency / setSampleRate / setLnaGain / setVgaGain / setAmpEnable / setAntennaPower, and TX: setTxVgaGain / setPtt / submitTxIq; sweep: startSweep / stopSweep.
  • TxInterpolator — polyphase Blackman-sinc interpolation raising the 48 kS/s modulator IQ to the board rate with unit DC gain per branch.

Testing without hardware

The wire codec and the interpolator are pinned by JVM contract tests in the parent project (isdr: HackRfProtocolTest, TxInterpolatorTest) — byte-exact payloads, filter and gain rules, sweep block parsing, and the measured spectral contract of the TX interpolation, all validated against the reference sources.

Credits and references

Faithful port of the reference host library and firmware semantics:

Request semantics, mode-switch behaviour and streaming alignment follow the hackrf_usb firmware sources and the libhackrf host library.

License

Dual-licensed — GPLv2+ only as part of the iSDR Drivers application; all other rights reserved. See LICENSE. The upstream libhackrf BSD 3-clause notice is retained there and in COPYING.md. Kotlin port © 2026 Isak Ruas isakruas@gmail.com.

About

Kotlin HackRF driver over the Android USB host API — pure Kotlin, JVM-testable wire codec.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

libhackrfk

Kotlin driver for the HackRF SDR (HackRF One, Jawbreaker, rad1o), speaking the libhackrf USB host protocol over the Android USB host API. Pure Kotlin — no NDK, no native libraries, no root. Built for Android but the wire codec is Android-free and JVM-testable.

Maintained by Isak — PU3IAR. Brought to you by id.qsl.br, a platform with tools for amateur radio operators. YouTube: @qraisak

Features

  • HackRfProtocol — the libhackrf wire codec, free of any Android dependency and unit-tested on the JVM:
    • Vendor request ids and payload encodings: frequency (MHz+Hz little-endian split), fractional sample rate (2–20 Msps) with the matching MAX2837 baseband filter selection, transceiver modes.
    • Gain rules exactly as the reference: LNA 0–40 dB in 8 dB steps, VGA 0–62 dB in 2 dB steps, TXVGA 0–47 dB, drive-scale mapping.
    • Signed 8-bit IQ sample conversion and the sweep block format (0x7F7F marker + u64 LE tuned frequency).
  • HackRfClient — USB transport and streaming lifecycle:
    • Device identity (VID 0x1d50), permission handling, RX streaming from the bulk-IN endpoint delivered as FloatArray (i0,q0,… in [-1,1]) with an optional power spectrum, through the same callback contract as the other iSDR clients.
    • Half-duplex TX: direct RX↔TX mode switches (never through OFF, which would drop the bias tee and RF amp), front-end state re-asserted across switches, and the transmit queue streamed to the bulk-OUT endpoint.
    • Firmware-driven sweep for wideband spectrum scans, with block reassembly and marker resynchronization.
    • setFrequency / setSampleRate / setLnaGain / setVgaGain / setAmpEnable / setAntennaPower, and TX: setTxVgaGain / setPtt / submitTxIq; sweep: startSweep / stopSweep.
  • TxInterpolator — polyphase Blackman-sinc interpolation raising the 48 kS/s modulator IQ to the board rate with unit DC gain per branch.

Testing without hardware

The wire codec and the interpolator are pinned by JVM contract tests in the parent project (isdr: HackRfProtocolTest, TxInterpolatorTest) — byte-exact payloads, filter and gain rules, sweep block parsing, and the measured spectral contract of the TX interpolation, all validated against the reference sources.

Credits and references

Faithful port of the reference host library and firmware semantics:

Request semantics, mode-switch behaviour and streaming alignment follow the hackrf_usb firmware sources and the libhackrf host library.

License

Dual-licensed — GPLv2+ only as part of the iSDR Drivers application; all other rights reserved. See LICENSE. The upstream libhackrf BSD 3-clause notice is retained there and in COPYING.md. Kotlin port © 2026 Isak Ruas isakruas@gmail.com.

About

Kotlin HackRF driver over the Android USB host API — pure Kotlin, JVM-testable wire codec.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages