added k209 driver
This commit is contained in:
@@ -0,0 +1,278 @@
|
||||
# Compact-M K209 / S2VNA Setup
|
||||
|
||||
This project controls the Compact-M K209 through the S2VNA SCPI server.
|
||||
The production path is:
|
||||
|
||||
```text
|
||||
K209 --USB-C--> S2VNA --HiSLIP/VISA--> radar_system
|
||||
```
|
||||
|
||||
There is no direct USB driver for K209 in this project. Do not use mock
|
||||
transports, socket fallbacks, or `pyvisa-py` for the K209 path. The required
|
||||
transport dependency is an IVI/Vendor VISA implementation that provides both
|
||||
`visa.h` and `libvisa.so`.
|
||||
|
||||
For maximum throughput the driver uses:
|
||||
|
||||
- HiSLIP, not TCP Socket.
|
||||
- A persistent VISA session.
|
||||
- Binary `FORM:DATA REAL32`.
|
||||
- Little-endian `FORM:BORD SWAP`.
|
||||
- One-time sweep configuration outside the acquisition loop.
|
||||
- Cached frequency axis after configuration, so repeated acquisition reads only
|
||||
the complex traces.
|
||||
- Point delay forced to `0` and sweep averaging forced `OFF`.
|
||||
- The acquisition loop sends one synchronized SCPI message:
|
||||
`TRIG:SING;*OPC?;:SENS:DATA:CORR? S11;:SENS:DATA:CORR? S21`.
|
||||
This keeps the trigger state valid while avoiding separate round trips for
|
||||
`*OPC?`, `S11`, and `S21`.
|
||||
|
||||
Do not remove the inline `*OPC?` from the hot path. On the tested K209/S2VNA
|
||||
setup, `TRIG:SING` followed immediately by data queries can return data but
|
||||
queues SCPI error `-211,"Trigger system is not in the trigger wait state"`.
|
||||
|
||||
## Required Components
|
||||
|
||||
Install these on the machine that runs the K209 smoke tests or acquisition
|
||||
process:
|
||||
|
||||
1. S2VNA from Planar.
|
||||
- On Linux the S2VNA manual describes the AppImage package
|
||||
`S2VNA_X.X.X_x86_64.AppImage`.
|
||||
- The K209 is connected to this S2VNA instance over USB-C.
|
||||
|
||||
2. IVI VISA runtime and development files.
|
||||
- Must provide `visa.h`.
|
||||
- Must provide `libvisa.so`.
|
||||
- Must support TCPIP HiSLIP resources.
|
||||
- Suitable implementations include NI-VISA or Keysight IO Libraries Suite.
|
||||
|
||||
3. Project Python environment.
|
||||
- Use the repository virtual environment, not system Python.
|
||||
- Install `requirements.txt` into `.venv`.
|
||||
|
||||
4. Native build dependencies.
|
||||
- C++20 compiler.
|
||||
- `make`.
|
||||
- `libusb-1.0` development files for the existing LibreVNA build.
|
||||
|
||||
## Ubuntu x86_64
|
||||
|
||||
Install base packages:
|
||||
|
||||
```bash
|
||||
sudo apt update
|
||||
sudo apt install build-essential make pkg-config python3-venv python3-pip libusb-1.0-0-dev
|
||||
```
|
||||
|
||||
Create or update the project virtual environment:
|
||||
|
||||
```bash
|
||||
cd /home/europa/Documents/radar_system
|
||||
python3 -m venv .venv
|
||||
.venv/bin/python -m pip install --upgrade pip
|
||||
.venv/bin/python -m pip install -r requirements.txt
|
||||
```
|
||||
|
||||
Install an IVI VISA implementation. For NI-VISA, install the NI Linux package
|
||||
repository from NI, then install the `ni-visa` package with the system package
|
||||
manager. For Keysight, install Keysight IO Libraries Suite for Linux with VISA
|
||||
support enabled.
|
||||
|
||||
Do not use Ubuntu's `libvisa-dev` / `libvisa0` packages for the K209 production
|
||||
path. Those packages come from `librevisa` and are not the vendor IVI VISA stack
|
||||
used for high-speed HiSLIP operation.
|
||||
|
||||
After installation, verify that the system exposes the required C and runtime
|
||||
files:
|
||||
|
||||
```bash
|
||||
ldconfig -p | grep libvisa
|
||||
find /usr /opt -name visa.h -o -name libvisa.so 2>/dev/null
|
||||
.venv/bin/pyvisa-info
|
||||
```
|
||||
|
||||
`pyvisa-info` must show the `ivi` backend with a found binary library.
|
||||
|
||||
If `visa.h` or `libvisa.so` is installed outside the default compiler/linker
|
||||
paths, pass the paths explicitly:
|
||||
|
||||
```bash
|
||||
make build/bin/k209_smoke_test \
|
||||
VISA_CXXFLAGS='-I/path/to/visa/include' \
|
||||
VISA_LDFLAGS='-pthread -lrt -L/path/to/visa/lib -lvisa'
|
||||
```
|
||||
|
||||
## S2VNA HiSLIP Server
|
||||
|
||||
Start S2VNA with the K209 connected over USB-C. Enable HiSLIP server on port
|
||||
`4880`. This can be done from the S2VNA UI:
|
||||
|
||||
```text
|
||||
System -> Settings -> Remote control network settings -> HiSLIP server -> On
|
||||
System -> Settings -> Remote control network settings -> HiSLIP port -> 4880
|
||||
```
|
||||
|
||||
The S2VNA command line can also enable the server:
|
||||
|
||||
```bash
|
||||
./S2VNA_X.X.X_x86_64.AppImage /HislipServer:on /HislipPort:4880
|
||||
```
|
||||
|
||||
For unattended runs, S2VNA also supports hiding the UI:
|
||||
|
||||
```bash
|
||||
./S2VNA_X.X.X_x86_64.AppImage /HislipServer:on /HislipPort:4880 /visible:off
|
||||
```
|
||||
|
||||
Verify that the server is listening:
|
||||
|
||||
```bash
|
||||
ss -ltnp | grep 4880
|
||||
```
|
||||
|
||||
The local VISA resource is:
|
||||
|
||||
```text
|
||||
TCPIP0::127.0.0.1::hislip0,4880::INSTR
|
||||
```
|
||||
|
||||
If S2VNA runs on another machine, replace `127.0.0.1` with that machine's IP
|
||||
address.
|
||||
|
||||
## Python Smoke Test
|
||||
|
||||
Use the project virtual environment:
|
||||
|
||||
```bash
|
||||
cd /home/europa/Documents/radar_system
|
||||
.venv/bin/python -m python_app.scripts.k209_smoke_test \
|
||||
--resource 'TCPIP0::127.0.0.1::hislip0,4880::INSTR' \
|
||||
--visa-library '@ivi' \
|
||||
--start-hz 10000000 \
|
||||
--stop-hz 100000000 \
|
||||
--points 11 \
|
||||
--ifbw-hz 10000 \
|
||||
--power-dbm -20 \
|
||||
--no-preset
|
||||
```
|
||||
|
||||
Expected result:
|
||||
|
||||
```text
|
||||
K209 IDN: Planar, K209, ...
|
||||
K209 sweep OK: points=11, first_hz=10000000.000, last_hz=100000000.000, ...
|
||||
```
|
||||
|
||||
Use `--no-preset` for the first smoke test to avoid resetting the current S2VNA
|
||||
session. Remove it when testing the full driver setup path.
|
||||
|
||||
## C++ Smoke Test
|
||||
|
||||
Build the C++ K209 smoke binary:
|
||||
|
||||
```bash
|
||||
cd /home/europa/Documents/radar_system
|
||||
make build/bin/k209_smoke_test
|
||||
```
|
||||
|
||||
Run it against the local S2VNA HiSLIP server:
|
||||
|
||||
```bash
|
||||
build/bin/k209_smoke_test \
|
||||
--resource 'TCPIP0::127.0.0.1::hislip0,4880::INSTR' \
|
||||
--start-hz 10000000 \
|
||||
--stop-hz 100000000 \
|
||||
--points 11 \
|
||||
--ifbw-hz 10000 \
|
||||
--power-dbm -20 \
|
||||
--no-preset
|
||||
```
|
||||
|
||||
If the build fails with `fatal error: visa.h: No such file or directory`, the
|
||||
IVI VISA development headers are not installed or are not visible to the
|
||||
compiler. If linking fails with `cannot find -lvisa`, the IVI VISA runtime or
|
||||
linker path is not installed correctly.
|
||||
|
||||
## Python Sweep Benchmark
|
||||
|
||||
Use this script to measure hot-loop sweep throughput for a selected sweep
|
||||
configuration. It keeps one VISA session open, configures the sweep once, caches
|
||||
the frequency axis once, then times repeated synchronized trigger/read cycles
|
||||
for binary `S11` and `S21` arrays.
|
||||
|
||||
Edit the configuration constants at the top of
|
||||
`python_app/scripts/k209_sweep_benchmark.py`, then run:
|
||||
|
||||
```bash
|
||||
cd /home/europa/Documents/radar_system
|
||||
.venv/bin/python -m python_app.scripts.k209_sweep_benchmark
|
||||
```
|
||||
|
||||
The reported `points_per_s` is:
|
||||
|
||||
```text
|
||||
timed_sweeps * points / total_timed_seconds
|
||||
```
|
||||
|
||||
Set `INCLUDE_RESULT_CONVERSION = True` only when you want to include Python
|
||||
`SweepResult` construction overhead. Keep it `False` when measuring the
|
||||
device/transport hot path.
|
||||
|
||||
## K209 Limits
|
||||
|
||||
The connected K209 reports these limits through SCPI service/capability
|
||||
queries:
|
||||
|
||||
```text
|
||||
frequency_hz: 9000 .. 9000000000
|
||||
ifbw_hz: 1 .. 300000
|
||||
power_dbm: -55 .. +5
|
||||
points: 2 .. 500001
|
||||
```
|
||||
|
||||
The S2VNA manual specifies the IFBW range with 1/3-decade spacing.
|
||||
`SENS:BAND` accepts values in the 1, 1.5, 2, 3, 5, 7 sequence across decades
|
||||
and clamps out-of-range values to the nearest limit.
|
||||
|
||||
The manual describes metrology/dynamic-range frequency subranges such as
|
||||
`9 kHz..300 kHz`, `300 kHz..2 MHz`, and `2 MHz..9 GHz`, but it does not expose a
|
||||
SCPI command for manually selecting an internal RF band. S2VNA handles internal
|
||||
range switching. Benchmark the exact frequency window used by the application
|
||||
when sweep speed matters.
|
||||
|
||||
The S2VNA manual also describes a SCPI FIFO buffer mode for very high-rate
|
||||
external-trigger sequences. It is not the right default for this driver stage:
|
||||
the manual limits it to specific analyzer families, external/repeated trigger
|
||||
workflows, one open channel, disabled display updates, and at most 3000 points
|
||||
per sweep. The current K209 path therefore uses synchronized HiSLIP binary
|
||||
sweeps instead of FIFO.
|
||||
|
||||
## Raspberry Pi OS
|
||||
|
||||
Raspberry Pi 5 uses ARM64/AArch64 when running 64-bit Raspberry Pi OS. The S2VNA
|
||||
Linux package described in the S2VNA manual is `x86_64`, and common vendor VISA
|
||||
packages are also primarily published for x86_64 Linux.
|
||||
|
||||
Do not assume local K209 acquisition on Raspberry Pi works until both of these
|
||||
are available for ARM64:
|
||||
|
||||
1. S2VNA build that can run on Raspberry Pi OS ARM64 and control the K209 over
|
||||
USB-C.
|
||||
2. IVI VISA implementation for ARM64 that provides `visa.h`, `libvisa.so`, and
|
||||
TCPIP HiSLIP support.
|
||||
|
||||
If those ARM64 dependencies are not available, run S2VNA and the acquisition
|
||||
process on an Ubuntu x86_64 machine. Raspberry Pi integration should then be
|
||||
handled at the system/pipeline level, not by replacing the K209 driver transport
|
||||
with a fallback.
|
||||
|
||||
## Expected Hardware Test Result
|
||||
|
||||
With S2VNA listening on `4880` and IVI/Vendor VISA installed correctly, the
|
||||
Python and C++ smoke tests should report:
|
||||
|
||||
```text
|
||||
K209 IDN: Planar, K209, ...
|
||||
K209 sweep OK: points=11, first_hz=10000000.000, last_hz=100000000.000
|
||||
```
|
||||
Reference in New Issue
Block a user