# Galileo Nav Icd

> Use when working with Galileo navigation message types (F/NAV, I/NAV, C/NAV, G/NAV) — page formats, bit sizes, timing, ICD references, or G1 vs G2 differences. Covers AD.36 (uplink GMSSSICD) and AD.37 (G1 SIS ICD) which are the primary references for this project.

- Skill: `iabuelruzz/galileo-nav-icd` (Agent Skill)
- Install (CLI): `npx skillmds@latest add iabuelruzz/galileo-nav-icd`
- Raw SKILL.md: https://api.skillmd.com/api/skills/iabuelruzz/galileo-nav-icd/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- License: project-internal
- Author: IAbuElRuzz (https://skillmd.com/u/iabuelruzz)
- Updated: 2026-09-22
- Page: https://skillmd.com/skills/iabuelruzz/galileo-nav-icd

---


# Galileo Navigation ICD Reference

G1 Galileo mission uplink reference for the eLTS project.

## Source Documents

| Reference | Document | Version | Use |
|---|---|---|---|
| **AD.36** | `GAL-ICD-GLI-SYST-A-0014` — G1 Ground-to-Space (GMSSSICD) | Issue 16.5, Oct 2024 | **Primary uplink ICD** — C-band frame, Message sub-frame, S-band nav section layouts, G/NAV batch formats, service descriptors |
| **AD.37** | `GAL-ICD-ESA-SYST-X-0027` — G1 Galileo SIS ICD | Issue 2.2, Dec 2018 | Downlink page structures, timing, CRC, FEC, interleaving for F/NAV, I/NAV, C/NAV, G/NAV |
| AD.52 | G2 SIS ICD | Issue 2.5, Feb 2022 | G2 differences; G2 public G/NAV structure is not available in this document |
| AD.54 | G2 S-band ICD | Issue 3.6, Jul 2024 | G2 S-band; explicitly supports G1G compatibility mode |
| AD.56 | Galileo Transition Mission Uplink ICD | Issue 3.4, Oct 2024 | G1→G2 transition; G2 adds CCSDS AOS/SDLS/LDPC framing |

ICD documents are in `ICD_Documents/` (gitignored). G1/G2 comparison summaries are in `ICD_Documents/g1_g2_differences/` as markdown files.

---

## Navigation Message Families

### F/NAV (E5a-I) — Open Service

| Parameter | Value |
|---|---:|
| Channel | E5a-I |
| Frame duration | 600 s |
| Sub-frames per frame | 12 |
| Sub-frame duration | 50 s |
| Pages per sub-frame | 5 |
| Page duration | 10 s |
| Sync symbols | 12 |
| Encoded symbols | 488 |
| Total symbols | 500 |
| Page type field | 6 bits |
| Navigation data | 208 bits |
| CRC | 24 bits |
| Tail | 6 bits |
| Total pre-FEC bits | **244 bits** (`FNAV_PAGE = 238` net without sync) |

Page types: 1 (clock/SISA/ionosphere/BGD), 2-3 (ephemeris), 4 (ephemeris+GST-UTC/GPS), 5-6 (almanac), 63 (dummy).

S-band uplink: 8 nav batch slots × 1000 bits/batch (`FNAV_BATCH = BATCH_START + 4 × FNAV_PAGE`). 1 almanac slot × 5760 bits.

---

### I/NAV (E5b-I + E1-B) — Open Service / CS

| Parameter | Value |
|---|---:|
| Channels | E5b-I and E1-B |
| Sub-frame duration | 30 s |
| Pages per sub-frame | 15 pairs |
| Page duration | 2 s per frequency |
| Total symbols per half page | 250 |
| Sync | 10 symbols |
| FEC symbols | 240 |
| Nominal word size | **128 bits** (split 112 + 16) |
| CRC | 24 bits |
| Tail | 6 bits |

Word types: 1-4 (clock/ephemeris), 5 (GST/BGD), 6 (GST-UTC), 7-10 (almanac), 11-15 (priority), 16 (reduced CED), 17-20 (RS CED), 0 (spare), 63 (dummy).

G2 additions: OSNMA (replaces EDBS 40-bit field), word types 22, 24 (EWS), 28-32 (NMA), 42-43 (CEFC/IAR).

S-band uplink: 8 nav batch slots × 816 bits/batch (`INAV_BATCH = BATCH_START + 6 × INAV_PAGE`). 1 almanac slot × 6192 bits.

---

### C/NAV (E6-B) — Commercial Service / HAS

| Parameter | Value |
|---|---:|
| Channel | E6-B |
| Frame duration | 120 s |
| Sub-frames per frame | 8 |
| Pages per sub-frame | 15 |
| Page duration | 1 s |
| Sync | 16 symbols |
| FEC symbols | 984 |
| Total symbols | 1000 |
| Page type / reserved | 14 bits |
| Payload | **448 bits** (encrypted; G1 = Commercial/key data, G2 = HAS) |
| CRC | 24 bits |
| Tail | 6 bits |

C/NAV-0 = dummy. Payload is encrypted — no public sub-field definitions. In G2 the payload becomes a 24-bit HAS Page Header + 424-bit HAS message, but same physical envelope.

---

### G/NAV (E6-A + E1-A) — PRS

| Parameter | Value |
|---|---:|
| Channels | E6-A and E1-A |
| Frame duration | 360 s |
| Sub-frames per frame | 12 |
| Sub-frame duration | 30 s |
| Pages per sub-frame | 5 |
| Logical page duration | 6 s (six 1 s symbol-page parts) |
| Initial field per 1 s part | 2 symbols (`00` = nominal, `11` = PRS alert) |
| Encoded symbols | 108 symbols per 1 s part |
| Total symbols | 660 |
| PRS data | **283 bits** (post-encryption, `G_NAV_WORD`) |
| On-board data | 27 bits |
| PRS region status | 8 bits |
| Tail | 6 bits |
| Total page bits | 324 bits |
| **Pre-encryption useful content** | **164 bits** (`_GNAV_PREENC_BITS`, `GNAV_BIT_SIZE` in `sbf_config.json`) |

#### G/NAV Page Types (AD.36 §4.2.4.4.4)

| Type | Name | Content | ICD ref |
|---|---|---|---|
| G/NAV-1 | Navigation 1 | SVID, clock correction, SISA, ionospheric correction, BGD, health, GST | §4.2.4.4.4.1 |
| G/NAV-2 | Navigation 2 | Ephemeris 1/3 | §4.2.4.4.4.1 |
| G/NAV-3 | Navigation 3 | Ephemeris 2/3 | §4.2.4.4.4.1 |
| G/NAV-4 | Navigation 4 | Ephemeris 3/3 | §4.2.4.4.4.1 |
| G/NAV-5 | Navigation 5 | GST-UTC, GST-GPS, TOW | §4.2.4.4.4.1 |
| G/NAV-6 | Almanac | Almanac parameters | §4.2.4.4.4.2 |
| G/NAV-7/8 | Priority / Integrity table | Priority messages; replace G/NAV-9 when available | §4.2.4.4.4 |
| G/NAV-9 | PRS | Continuous PRS data; classified batch internals | #GMSSSICD-3644 |

---

## Key Requirement IDs (AD.36 GMSSSICD)

These `#GMSSSICD-XXXX` identifiers appear as code comments throughout the parser:

| ID | Topic |
|---|---|
| `#GMSSSICD-3640` | Up to 9 G/NAV nav batch slots between `GNAV_OFFSET` and `GNAV_ALMANAC_OFFSET` |
| `#GMSSSICD-3644` | G/NAV-9 PRS batch: 20 slots × 26 G/NAV-9 words; `GNAV_PRS_OFFSET = 60456 bits`; `G_NAV_PRS_BATCH = 7408 bits` |
| `#GMSSSICD-3717` | G/NAV encryption: all G/NAV messages encrypted before packetisation; pre-enc = 164 bits, post-enc = 283 bits |
| `#GMSSSICD-3749` | G/NAV-6 almanac: 8 batch slots (4 SV groups × 2 batches), 9 G/NAV-6 words/slot; `G_NAV_ALMANAC_BATCH = 2600 bits` |
| `#GMSSSICD-3752` | Dummy batch detection: slot 5 is dummy when <5 nav batches available; TOW = all-ones AND WN = all-ones in BATCH_START |

---

## C-Band Uplink Frame (AD.36 §4.2.4)

| Field | Size | Role |
|---|---:|---|
| Sync word | 64 bits | Frame synchronization |
| **Integrity sub-frame** | 640 transmitted bits (528 data before RS) | Time-critical: integrity table, EDBS, security, alerts |
| **Message sub-frame** | 4080 transmitted bits (two 1784-bit fields before RS) | Non-time-critical: F/NAV, I/NAV, C/NAV, SAR, G/NAV |
| Message security packet | 200 bits | Authenticates Message sub-frame |
| Idle sequence | 42 bits | Alternating pair |

Total uplink frame: **4826 bits = 1 second**.

Reed-Solomon coding: `RS(255,223)` per Message sub-frame field (16-error correction), `RS(80,66)` for Integrity sub-frame (7-error correction).

---

## G1 vs G2 Key Differences (from `ICD_Documents/g1_g2_differences/`)

| Area | G1 | G2 |
|---|---|---|
| I/NAV authentication field | 40-bit EDBS | 40-bit OSNMA |
| I/NAV new word types | — | 22 (ARAIM), 24 (EWS), 28-32 (NMA), 42-43 (CEFC/IAR) |
| C-band data link | Custom 1 s frame with RS | CCSDS AOS/SDLS/LDPC + G1G compatibility |
| C/NAV payload | Commercial Service / key management | HAS (24-bit header + 424-bit message) |
| G/NAV downlink | Full public G1 structure in AD.37 | Not public in supplied G2 SIS ICD (AD.52) |
| F/NAV | Unchanged | Unchanged |
| C/NAV page envelope | Same | Same |
| S-band | Not in G1 set; G2 explicitly supports G1G degraded nav data | G2 S-band ICD covers both G1G and G2 modes |

F/NAV is **fully identical** between G1 and G2. I/NAV sub-frame timing and page shell are the same — only field semantics differ.

---

## Bit Sizes Summary Table

| Nav type | S-band page/word size | BATCH_START | Batch size | Notes |
|---|---:|---:|---:|---|
| F/NAV | 238 bits (`FNAV_PAGE`) | 48 bits | 1000 bits | BATCH_START + 4 × 238 + 8 spare |
| I/NAV | 128 bits (`INAV_PAGE`) | 48 bits | 816 bits | BATCH_START + 6 × 128 |
| G/NAV nav | 283 bits (`G_NAV_WORD`) | 48 bits | 1464 bits | BATCH_START + 5 × 283 + 1 spare |
| G/NAV almanac | 283 bits (`G_NAV_WORD`) | 48 bits | 2600 bits | BATCH_START + 9 × 283 + 5 spare |
| G/NAV PRS | 283 bits (`G_NAV_WORD`) | 48 bits | 7408 bits | BATCH_START + 26 × 283 + 2 spare |

All constants are loaded from `config/s_band_config.json`. Verify with `config_manager.get_s_band_config()["bit_length"]`.

