How uplink scheduling works
In downlink, the gNB decides everything and just tells the UE via DCI. In uplink, the process is more involved — the gNB cannot know how much data the UE has to send. The UE must first signal its buffer status, and the gNB grants uplink resources in response.
Buffer Status Report (BSR)
A BSR reports the amount of data waiting in each logical channel group (LCG). LCGs are configured by RRC and group bearers by priority. The gNB uses the BSR to decide how many RBs to grant next time.
// Short BSR format (1 LCG reported, 1 byte): LCG ID = 1 ← LCG 1 (user data bearers) Buffer = 18 ← index 18 → ~300 kB pending // Long BSR format (all LCGs, used when >1 LCG has data): LCG 0: 0 ← no SRB data pending LCG 1: 18 ← 300 kB user data (video upload) LCG 2: 0 ... // Buffer size index table (selected entries): Index 0: 0 bytes Index 10: 3,072 bytes (~3 kB) Index 18: ~300 kB Index 25: ~2 MB Index 31: 30,576,752+ bytes (maximum)
DCI 0_1 — uplink grant fields
| Field | Value | Meaning |
|---|---|---|
| Freq domain resource | RIV=542 | RBs 8–29 (22 RBs) |
| Time domain (K2) | K2=4 | Transmit 4 slots after this DCI |
| MCS | 16 | 64-QAM, code rate 0.60 |
| HARQ process | 0b0001 = 1 | UL HARQ process 1 |
| TPC for PUSCH | +1 dB | Slight power increase commanded |
| UL/SUL indicator | 0 | Normal UL (not supplementary) |
Uplink power control
Unlike the downlink where the gNB knows its own transmit power, uplink power control is a critical mechanism. The gNB wants the UE's signal to arrive at a specific target power — high enough to decode but not so high as to cause interference to other cells.
P_PUSCH = min(P_CMAX, 10log10(2^μ × M_RB) + P_O_PUSCH + α × PL + ΔTF + f(i))
// Parameters (from RRC configuration): P_O_PUSCH = −90 dBm ← target received power at 1 RB (gNB configured) α = 0.8 ← path loss compensation factor (0=no comp, 1=full) PL = 128 dB ← path loss (from RSRP measurement) M_RB = 22 ← allocated RBs μ = 1 ← numerology ΔTF = 0 dB ← MCS-dependent offset f(i) = +1 dB ← TPC accumulation from DCI // Calculation: P = 10×log10(2^1 × 22) + (−90) + 0.8×128 + 0 + 1 = 16.4 + (−90) + 102.4 + 0 + 1 = +29.8 dBm // Capped at P_CMAX = 23 dBm: P_PUSCH = min(23, 29.8) = 23 dBm ← UE at max power
DFT-s-OFDM vs CP-OFDM for uplink
For uplink, the UE can use either CP-OFDM (same as downlink) or DFT-s-OFDM (DFT-spread OFDM). DFT-s-OFDM has a lower Peak-to-Average Power Ratio (PAPR) — crucial for the UE's power amplifier efficiency. Lower PAPR means the UE can transmit at higher average power without distortion, improving coverage.
The choice is configured by RRC. Our UE is configured for DFT-s-OFDM (single-layer, RRC configured transformPrecoder = enabled).