# chip_test_example

Tests for LR1121 LoRa, ICM-20948 IMU, u-blox GPS on Raspberry Pi Zero W 2.
Header-only drivers, kernel ioctls, no external libs.

Driver: `lr1121_malnus.hpp` — crystal oscillator, RF switch via DIO5/DIO6.

---

## Wiring

### LR1121 (SPI0)

| Module  | Pi GPIO | Pi pin |
|---------|---------|--------|
| SCK     | GPIO11  | 23 |
| MOSI    | GPIO10  | 19 |
| MISO    | GPIO9   | 21 |
| NSS     | GPIO8   | 24 |
| BUSY    | GPIO24  | 18 |
| NRESET  | GPIO25  | 22 |
| DIO5    | —       | chip-driven RF switch (RFSW0) |
| DIO6    | —       | chip-driven RF switch (RFSW1) |
| DIO9    | GPIO4   | 7  |
| DIO8    | GPIO23  | 16 |

DIO5 and DIO6 are driven directly by the LR1121 — they go to your module's RF
switch and do not connect to the Pi. The driver configures them automatically
via `SetDioAsRfSwitch`: HIGH on DIO5 in RX, HIGH on DIO6 in TX, both LOW in standby.

Enable SPI: `sudo raspi-config` → Interfaces → SPI → Yes → reboot

### ICM-20948 (I2C1)

| Module | Pi GPIO | Pi pin |
|--------|---------|--------|
| SDA    | GPIO2   | 3 |
| SCL    | GPIO3   | 5 |
| AD0    | GND → addr 0x68 / VCC → addr 0x69 |

Enable: `sudo raspi-config` → Interfaces → I2C → Yes → reboot

### u-blox GPS (UART0)

| Module | Pi GPIO | Pi pin |
|--------|---------|--------|
| TX     | GPIO15  | 10 |
| RX     | GPIO14  | 8  |

Enable: `sudo raspi-config` → Interfaces → Serial Port → login shell: No, hardware: Yes → reboot

---

## Build

```sh
sudo apt install g++ make
make
```

Run verbose first so you see exactly where it fails:

```sh
sudo ./lora_rx -v --433
sudo ./imu_test -v
./gps_test -v
```

---

## LoRa debug

```sh
ls /dev/spidev0.0         # SPI enabled?
sudo ./lora_rx -v --433   # step labels show exactly which command hangs
```

If it hangs at `Calibrate` — the chip isn't responding over SPI at all.
Check wiring, CS, and that SPI is enabled. The crystal needs no tuning.

If TX/RX runs but packets never arrive — check that DIO5/DIO6 reach the RF
switch on your module. Without the switch, the antenna path is disconnected.

To try 2.4 GHz instead (different antenna required):

```sh
sudo ./lora_rx -v --24
sudo ./lora_tx -v --24
```

If the chip is stuck in bootloader (fw < 0x02xx), escape with:

```sh
sudo ./lora_rx --reset
```

---

## IMU debug

```sh
sudo i2cdetect -y 1     # 0x68 or 0x69 must show
sudo ./imu_test -v      # auto-detects both addresses
sudo ./imu_test -v -r   # raw 16-bit values
```

Nothing on i2cdetect: I2C not enabled, wrong wiring, or no pull-ups on SDA/SCL.

---

## GPS debug

```sh
ls -la /dev/serial0
stty -F /dev/serial0 38400 raw && cat /dev/serial0   # raw NMEA bytes
./gps_test -v -a                                      # all sentences
./gps_test -b 9600                                    # try different baud
```
