Skip to content

Commit

Permalink
python/trx: fork RadioInterfaceUHD from RadioInterface
Browse files Browse the repository at this point in the history
Change-Id: I1644a3f6b8da0d5f2a1a133058269e5383948fda
  • Loading branch information
axilirator committed Jan 22, 2019
1 parent 404842d commit 3120ba7
Show file tree
Hide file tree
Showing 5 changed files with 97 additions and 36 deletions.
3 changes: 2 additions & 1 deletion apps/grgsm_trx
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ from argparse import ArgumentParser
from argparse import ArgumentTypeError
from gnuradio import eng_notation

from grgsm.trx import RadioInterfaceUHD
from grgsm.trx import RadioInterface
from grgsm.trx import Transceiver

Expand Down Expand Up @@ -58,7 +59,7 @@ class Application:
signal.signal(signal.SIGINT, self.sig_handler)

# Init Radio interface
self.radio = RadioInterface(self.phy_args, self.phy_sample_rate,
self.radio = RadioInterfaceUHD(self.phy_args, self.phy_sample_rate,
self.phy_rx_gain, self.phy_tx_gain, self.phy_ppm,
self.phy_rx_antenna, self.phy_tx_antenna,
self.phy_freq_offset, self.bind_addr,
Expand Down
1 change: 1 addition & 0 deletions python/trx/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ GR_PYTHON_INSTALL(
ctrl_if.py
ctrl_if_bb.py
radio_if.py
radio_if_uhd.py
radio_if_grc.py
transceiver.py
dict_toggle_sign.py
Expand Down
1 change: 1 addition & 0 deletions python/trx/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
from ctrl_if_bb import CTRLInterfaceBB
from radio_if_grc import RadioInterfaceGRC
from radio_if import RadioInterface
from radio_if import RadioInterfaceUHD
from transceiver import Transceiver

from dict_toggle_sign import dict_toggle_sign
55 changes: 20 additions & 35 deletions python/trx/radio_if.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
# -*- coding: utf-8 -*-

# GR-GSM based transceiver
# Follow graph implementation
# Generic (device independent) flow-graph implementation
#
# (C) 2016-2019 by Vadim Yanitskiy <[email protected]>
# (C) 2017 by Piotr Krysik <[email protected]>
Expand Down Expand Up @@ -33,7 +33,6 @@
from gnuradio import eng_notation
from gnuradio import digital
from gnuradio import blocks
from gnuradio import uhd
from gnuradio import gr

from gnuradio import filter
Expand All @@ -57,11 +56,6 @@ class RadioInterface(gr.top_block):
GSM_SYM_RATE = (1.0 / GSM_SYM_PERIOD_uS) * 1e6
SAMPLE_RATE = GSM_SYM_RATE * osr

# FIXME: shall be measured (automatically?) for
# particular device and particular clock rate.
# The current value is measured for USRP B2X0 at 26e6.
delay_correction = (285.616 + 2 * GSM_SYM_PERIOD_uS) * 1e-6

# Dummy freq. value that is used during initialization
# basically, the DL freq. of ARFCN 0
DUMMY_FREQ = 935e6
Expand All @@ -83,6 +77,10 @@ def __init__(self, phy_args, phy_sample_rate,
self.ppm = phy_ppm
self.freq_offset = phy_freq_offset

self.phy_args = phy_args
self.rx_antenna = phy_rx_antenna
self.tx_antenna = phy_tx_antenna

gr.top_block.__init__(self, "GR-GSM TRX")

# TRX Burst Interface
Expand All @@ -91,15 +89,7 @@ def __init__(self, phy_args, phy_sample_rate,
str(trx_base_port))

# RX path definition
self.phy_src = uhd.usrp_source(phy_args,
uhd.stream_args(cpu_format="fc32",
channels=range(1)))

self.phy_src.set_clock_rate(26e6, uhd.ALL_MBOARDS)
self.phy_src.set_antenna(phy_rx_antenna, 0)
self.phy_src.set_samp_rate(phy_sample_rate)
self.phy_src.set_bandwidth(650e3, 0)
self.phy_src.set_gain(phy_rx_gain)
self.phy_init_source()

self.msg_to_tag_src = grgsm.msg_to_tag()

Expand All @@ -115,7 +105,7 @@ def __init__(self, phy_args, phy_sample_rate,

# Connections
self.connect(
(self.phy_src, 0),
(self._phy_src, 0),
(self.msg_to_tag_src, 0))

self.connect(
Expand All @@ -140,18 +130,11 @@ def __init__(self, phy_args, phy_sample_rate,


# TX Path Definition
self.phy_sink = uhd.usrp_sink(phy_args,
uhd.stream_args(cpu_format="fc32",
channels=range(1)), "packet_len")

self.phy_sink.set_clock_rate(26e6, uhd.ALL_MBOARDS)
self.phy_sink.set_antenna(phy_tx_antenna, 0)
self.phy_sink.set_samp_rate(phy_sample_rate)
self.phy_sink.set_gain(self.tx_gain)
self.phy_init_sink()

self.tx_time_setter = grgsm.txtime_setter(
0xffffffff, 0, 0, 0, 0, 0,
self.delay_correction + self.GSM_UL_DL_SHIFT_uS * 1e-6)
self.phy_proc_delay + self.GSM_UL_DL_SHIFT_uS * 1e-6)

self.tx_burst_proc = grgsm.preprocess_tx_burst()

Expand Down Expand Up @@ -200,7 +183,7 @@ def __init__(self, phy_args, phy_sample_rate,

self.connect(
(self.rotator_sink, 0),
(self.phy_sink, 0))
(self._phy_sink, 0))


# RX & TX synchronization
Expand Down Expand Up @@ -245,11 +228,11 @@ def __init__(self, phy_args, phy_sample_rate,
(self.dict_toggle_sign, 'dict_out'),
(self.msg_to_tag_sink, 'msg'))

def phy_init_source(self):
raise NotImplementedError

# Some UHD devices (such as UmTRX) do start the clock
# not from 0, so it's required to reset it manually.
# Resetting UHD source will also affect the sink.
self.phy_src.set_time_now(uhd.time_spec(0.0))
def phy_init_sink(self):
raise NotImplementedError

def shutdown(self):
print("[i] Shutdown Radio interface")
Expand Down Expand Up @@ -281,9 +264,10 @@ def set_rx_freq(self, fc):
print("[#] Shifting RX freq. to %s (offset is %s)"
% (eng_notation.num_to_str(fc),
eng_notation.num_to_str(self.freq_offset)))
self.phy_src.set_center_freq(fc, 0)

self.rotator_src.set_phase_inc(self.calc_phase_inc(fc))
self.gsm_clck_ctrl.set_fc(fc)
self.phy_set_rx_freq(fc)
self.rx_freq = fc

def set_tx_freq(self, fc):
Expand All @@ -292,16 +276,17 @@ def set_tx_freq(self, fc):
print("[#] Shifting TX freq. to %s (offset is %s)"
% (eng_notation.num_to_str(fc),
eng_notation.num_to_str(self.freq_offset)))
self.phy_sink.set_center_freq(fc, 0)

self.rotator_sink.set_phase_inc(-self.calc_phase_inc(fc))
self.phy_set_tx_freq(fc)
self.tx_freq = fc

def set_rx_gain(self, gain):
self.phy_src.set_gain(gain, 0)
self.phy_set_rx_gain(gain)
self.rx_gain = gain

def set_tx_gain(self, gain):
self.phy_sink.set_gain(gain, 0)
self.phy_set_tx_gain(gain)
self.tx_gain = gain

def set_slot(self, slot, config):
Expand Down
73 changes: 73 additions & 0 deletions python/trx/radio_if_uhd.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
#!/usr/bin/env python2
# -*- coding: utf-8 -*-

# GR-GSM based transceiver
# Radio interface for UHD devices
#
# (C) 2019 by Vadim Yanitskiy <[email protected]>
#
# All Rights Reserved
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.

from gnuradio import uhd

from radio_if import RadioInterface

class RadioInterfaceUHD(RadioInterface):
@property
def phy_proc_delay(self):
# FIXME: shall be measured (automatically?) for
# particular device and particular clock rate.
# The current value is measured for USRP B2X0 at 26e6.
return (285.616 + 2 * self.GSM_SYM_PERIOD_uS) * 1e-6

def phy_init_source(self):
self._phy_src = uhd.usrp_source(self.phy_args,
uhd.stream_args(cpu_format = "fc32",
channels = range(1)))

self._phy_src.set_clock_rate(26e6, uhd.ALL_MBOARDS)
self._phy_src.set_antenna(self.rx_antenna, 0)
self._phy_src.set_samp_rate(self.sample_rate)
self._phy_src.set_bandwidth(650e3, 0)
self._phy_src.set_gain(self.rx_gain)

# Some UHD devices (such as UmTRX) do start the clock
# not from 0, so it's required to reset it manually.
# Resetting UHD source will also affect the sink.
self._phy_src.set_time_now(uhd.time_spec(0.0))

def phy_init_sink(self):
self._phy_sink = uhd.usrp_sink(self.phy_args,
uhd.stream_args(cpu_format = "fc32",
channels = range(1)), "packet_len")

self._phy_sink.set_clock_rate(26e6, uhd.ALL_MBOARDS)
self._phy_sink.set_antenna(self.tx_antenna, 0)
self._phy_sink.set_samp_rate(self.sample_rate)
self._phy_sink.set_gain(self.tx_gain)

def phy_set_rx_freq(self, freq):
self._phy_src.set_center_freq(freq, 0)

def phy_set_tx_freq(self, freq):
self._phy_sink.set_center_freq(freq, 0)

def phy_set_rx_gain(self, gain):
self._phy_src.set_gain(gain, 0)

def phy_set_tx_gain(self, gain):
self._phy_sink.set_gain(gain, 0)

0 comments on commit 3120ba7

Please sign in to comment.