mirror of
https://gitea.osmocom.org/cellular-infrastructure/osmo-trx.git
synced 2025-11-01 12:43:33 +00:00
Compare commits
17 Commits
Hoernchen/
...
1.7.0
Author | SHA1 | Date | |
---|---|---|---|
|
4f6e9eb4cf | ||
|
24f938bfa5 | ||
|
132ec7452d | ||
|
553d6b0b51 | ||
|
a7f5826351 | ||
|
75cf9254a3 | ||
|
c5f623f966 | ||
|
8fd51cb7c9 | ||
|
e6dc78e5c5 | ||
|
9982b33597 | ||
|
52ef221657 | ||
|
ec13193cae | ||
|
3d8598d460 | ||
|
1d7f5a9175 | ||
|
511d62733e | ||
|
8f19df3bd7 | ||
|
b7cde0f6a2 |
1
.github/FUNDING.yml
vendored
Normal file
1
.github/FUNDING.yml
vendored
Normal file
@@ -0,0 +1 @@
|
||||
open_collective: osmocom
|
@@ -54,7 +54,6 @@ EXTRA_DIST = \
|
||||
LEGAL \
|
||||
COPYING \
|
||||
README.md \
|
||||
contrib/osmo-trx.spec.in \
|
||||
debian \
|
||||
git-version-gen \
|
||||
$(NULL)
|
||||
|
28
README.md
28
README.md
@@ -4,17 +4,17 @@ About OsmoTRX
|
||||
OsmoTRX is a software-defined radio transceiver that implements the Layer 1
|
||||
physical layer of a BTS comprising the following 3GPP specifications:
|
||||
|
||||
* TS 05.01 "Physical layer on the radio path"
|
||||
* TS 05.02 "Multiplexing and Multiple Access on the Radio Path"
|
||||
* TS 05.04 "Modulation"
|
||||
* TS 05.10 "Radio subsystem synchronization"
|
||||
* TS 05.01 *Physical layer on the radio path*
|
||||
* TS 05.02 *Multiplexing and Multiple Access on the Radio Path*
|
||||
* TS 05.04 *Modulation*
|
||||
* TS 05.10 *Radio subsystem synchronization*
|
||||
|
||||
OsmoTRX is originally based on the transceiver code from the
|
||||
[OpenBTS](https://osmocom.org/projects/osmobts/wiki/OpenBTS) project, but setup
|
||||
to operate independently with the purpose of using with non-OpenBTS software and
|
||||
projects, specifically within the Osmocom stack. Used together with
|
||||
[OsmoBTS](https://osmocom.org/projects/osmobts/wiki) you can get a pretty
|
||||
standard GSM BTS with Abis interface as per the relevant 3GPP specifications.
|
||||
standard GSM/GPRS/EGPRS BTS with Abis interface as per the relevant 3GPP specifications.
|
||||
|
||||
Homepage
|
||||
--------
|
||||
@@ -27,7 +27,7 @@ GIT Repository
|
||||
|
||||
You can clone from the official osmo-trx.git repository using
|
||||
|
||||
git clone https://gitea.osmocom.org/cellular-infrastructure/osmo-trx`
|
||||
git clone https://gitea.osmocom.org/cellular-infrastructure/osmo-trx
|
||||
|
||||
There is a web interface at <https://gitea.osmocom.org/cellular-infrastructure/osmo-trx>
|
||||
|
||||
@@ -39,6 +39,13 @@ also available online for each of the sub-libraries at User Manual for OsmoTRX
|
||||
can be generated during the build process, and is also available online at
|
||||
<https://ftp.osmocom.org/docs/latest/osmotrx-usermanual.pdf>.
|
||||
|
||||
Forum
|
||||
-----
|
||||
|
||||
We welcome any osmo-trx related discussions in the
|
||||
[Cellular Network Infrastructure -> 2 RAN (GERAN)](https://discourse.osmocom.org/c/cni/geran)
|
||||
section of the osmocom discourse (web based Forum).
|
||||
|
||||
Mailing List
|
||||
------------
|
||||
|
||||
@@ -50,13 +57,20 @@ Please observe the [Osmocom Mailing List
|
||||
Rules](https://osmocom.org/projects/cellular-infrastructure/wiki/Mailing_List_Rules)
|
||||
when posting.
|
||||
|
||||
Issue Tracker
|
||||
-------------
|
||||
|
||||
We use the [issue tracker of the osmo-trx project on osmocom.org](https://osmocom.org/projects/osmotrx/issues) for
|
||||
tracking the state of bug reports and feature requests. Feel free to submit any issues you may find, or help
|
||||
us out by resolving existing issues.
|
||||
|
||||
Contributing
|
||||
------------
|
||||
|
||||
Our coding standards are described at
|
||||
<https://osmocom.org/projects/cellular-infrastructure/wiki/Coding_standards>
|
||||
|
||||
We us a gerrit based patch submission/review process for managing contributions.
|
||||
We use a Gerrit based patch submission/review process for managing contributions.
|
||||
Please see <https://osmocom.org/projects/cellular-infrastructure/wiki/Gerrit>
|
||||
for more details
|
||||
|
||||
|
@@ -0,0 +1,9 @@
|
||||
# When cleaning up this file: bump API version in corresponding Makefile.am and rename corresponding debian/lib*.install
|
||||
# according to https://osmocom.org/projects/cellular-infrastructure/wiki/Make_a_new_release
|
||||
# In short: https://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html#Updating-version-info
|
||||
# LIBVERSION=c:r:a
|
||||
# If the library source code has changed at all since the last update, then increment revision: c:r + 1:a.
|
||||
# If any interfaces have been added, removed, or changed since the last update: c + 1:0:a.
|
||||
# If any interfaces have been added since the last public release: c:r:a + 1.
|
||||
# If any interfaces have been removed or changed since the last public release: c:r:0.
|
||||
#library what description / commit summary line
|
||||
|
@@ -127,16 +127,16 @@ osmo_trx_uhd_LDADD = \
|
||||
$(UHD_LIBS)
|
||||
osmo_trx_uhd_CPPFLAGS = $(AM_CPPFLAGS) $(UHD_CFLAGS)
|
||||
|
||||
if ENABLE_MS_TRX
|
||||
bin_PROGRAMS += osmo-trx-ms-uhd
|
||||
osmo_trx_ms_uhd_SOURCES = $(MS_LOWER_SRC) $(MS_UPPER_SRC)
|
||||
osmo_trx_ms_uhd_LDADD = \
|
||||
$(builddir)/device/uhd/libdevice.la \
|
||||
$(COMMON_LDADD) \
|
||||
$(UHD_LIBS) \
|
||||
$(TRXCON_LDADD)
|
||||
osmo_trx_ms_uhd_CPPFLAGS = $(AM_CPPFLAGS) $(UHD_CFLAGS) -DBUILDUHD
|
||||
endif
|
||||
#if ENABLE_MS_TRX
|
||||
#bin_PROGRAMS += osmo-trx-ms-uhd
|
||||
#osmo_trx_ms_uhd_SOURCES = $(MS_LOWER_SRC) $(MS_UPPER_SRC)
|
||||
#osmo_trx_ms_uhd_LDADD = \
|
||||
# $(builddir)/device/uhd/libdevice.la \
|
||||
# $(COMMON_LDADD) \
|
||||
# $(UHD_LIBS) \
|
||||
# $(TRXCON_LDADD)
|
||||
#osmo_trx_ms_uhd_CPPFLAGS = $(AM_CPPFLAGS) $(UHD_CFLAGS) -DBUILDUHD
|
||||
#endif
|
||||
endif
|
||||
|
||||
if DEVICE_USRP1
|
||||
|
@@ -269,7 +269,8 @@ struct blade_hw {
|
||||
|
||||
bool is_locked;
|
||||
blade_check(bladerf_set_pll_enable, dev, true);
|
||||
blade_check(bladerf_set_pll_refclk, dev, 10000000UL);
|
||||
uint64_t refclock = 10000000UL;
|
||||
blade_check(bladerf_set_pll_refclk, dev, refclock);
|
||||
for (int i = 0; i < 20; i++) {
|
||||
usleep(50 * 1000);
|
||||
bladerf_get_pll_lock_state(dev, &is_locked);
|
||||
|
@@ -645,6 +645,7 @@ int main(int argc, char *argv[])
|
||||
|
||||
osmo_init_logging2(tall_trx_ctx, &log_info);
|
||||
log_enable_multithread();
|
||||
log_cache_enable();
|
||||
osmo_stats_init(tall_trx_ctx);
|
||||
vty_init(&g_vty_info);
|
||||
logging_vty_add_cmds();
|
||||
|
10
configure.ac
10
configure.ac
@@ -82,10 +82,10 @@ AC_TYPE_SIZE_T
|
||||
AC_HEADER_TIME
|
||||
AC_C_BIGENDIAN
|
||||
|
||||
PKG_CHECK_MODULES(LIBOSMOCORE, libosmocore >= 1.9.0)
|
||||
PKG_CHECK_MODULES(LIBOSMOVTY, libosmovty >= 1.9.0)
|
||||
PKG_CHECK_MODULES(LIBOSMOCTRL, libosmoctrl >= 1.9.0)
|
||||
PKG_CHECK_MODULES(LIBOSMOCODING, libosmocoding >= 1.9.0)
|
||||
PKG_CHECK_MODULES(LIBOSMOCORE, libosmocore >= 1.10.0)
|
||||
PKG_CHECK_MODULES(LIBOSMOVTY, libosmovty >= 1.10.0)
|
||||
PKG_CHECK_MODULES(LIBOSMOCTRL, libosmoctrl >= 1.10.0)
|
||||
PKG_CHECK_MODULES(LIBOSMOCODING, libosmocoding >= 1.10.0)
|
||||
|
||||
AC_ARG_ENABLE(sanitize,
|
||||
[AS_HELP_STRING(
|
||||
@@ -240,7 +240,6 @@ AS_IF([test "x$with_sse" != "xno"], [
|
||||
AM_CONDITIONAL(HAVE_SSE4_1, false)
|
||||
])
|
||||
|
||||
dnl Check if the compiler supports specified GCC's built-in function
|
||||
AC_DEFUN([CHECK_BUILTIN_SUPPORT], [
|
||||
AC_CACHE_CHECK(
|
||||
[whether ${CC} has $1 built-in],
|
||||
@@ -380,6 +379,5 @@ AC_CONFIG_FILES([\
|
||||
contrib/Makefile \
|
||||
contrib/systemd/Makefile \
|
||||
doc/manuals/Makefile \
|
||||
contrib/osmo-trx.spec \
|
||||
])
|
||||
AC_OUTPUT
|
||||
|
@@ -85,7 +85,17 @@ export PKG_CONFIG_PATH="$inst/lib/pkgconfig:$PKG_CONFIG_PATH"
|
||||
export LD_LIBRARY_PATH="$inst/lib"
|
||||
export PATH="$inst/bin:$PATH"
|
||||
|
||||
CONFIG="--enable-sanitize --enable-werror --with-uhd --with-usrp1 --with-lms --with-ipc --with-mstrx $INSTR"
|
||||
CONFIG="
|
||||
--enable-sanitize
|
||||
--enable-werror
|
||||
--with-bladerf
|
||||
--with-ipc
|
||||
--with-lms
|
||||
--with-mstrx
|
||||
--with-uhd
|
||||
--with-usrp1
|
||||
$INSTR
|
||||
"
|
||||
|
||||
# Additional configure options and depends
|
||||
if [ "$WITH_MANUALS" = "1" ]; then
|
||||
@@ -109,7 +119,7 @@ $MAKE check \
|
||||
|| cat-testlogs.sh
|
||||
|
||||
if arch | grep -v -q arm; then
|
||||
DISTCHECK_CONFIGURE_FLAGS="$CONFIG" $MAKE $PARALLEL_MAKE distcheck \
|
||||
DISTCHECK_CONFIGURE_FLAGS="$(echo $CONFIG | tr -d '\n')" $MAKE $PARALLEL_MAKE distcheck \
|
||||
|| cat-testlogs.sh
|
||||
fi
|
||||
|
||||
|
@@ -1,254 +0,0 @@
|
||||
#
|
||||
# spec file for package osmo-trx
|
||||
#
|
||||
# Copyright (c) 2017, Martin Hauke <mardnh@gmx.de>
|
||||
#
|
||||
# All modifications and additions to the file contributed by third parties
|
||||
# remain the property of their copyright owners, unless otherwise agreed
|
||||
# upon. The license for this file, and modifications and additions to the
|
||||
# file, is the same license as for the pristine package itself (unless the
|
||||
# license for the pristine package is not an Open Source License, in which
|
||||
# case the license is the MIT License). An "Open Source License" is a
|
||||
# license that conforms to the Open Source Definition (Version 1.9)
|
||||
# published by the Open Source Initiative.
|
||||
|
||||
Name: osmo-trx
|
||||
Version: @VERSION@
|
||||
Release: 0
|
||||
Summary: SDR transceiver that implements Layer 1 of a GSM BTS
|
||||
License: AGPL-3.0-or-later
|
||||
Group: Productivity/Telephony/Servers
|
||||
URL: https://osmocom.org/projects/osmotrx
|
||||
Source: %{name}-%{version}.tar.xz
|
||||
BuildRequires: autoconf
|
||||
BuildRequires: automake
|
||||
BuildRequires: fdupes
|
||||
BuildRequires: gcc-c++
|
||||
BuildRequires: libtool
|
||||
BuildRequires: pkgconfig >= 0.20
|
||||
%if 0%{?suse_version}
|
||||
BuildRequires: systemd-rpm-macros
|
||||
%endif
|
||||
%if ! 0%{?centos_ver}
|
||||
BuildRequires: pkgconfig(LimeSuite)
|
||||
BuildRequires: pkgconfig(usrp) >= 3.3
|
||||
%endif
|
||||
BuildRequires: pkgconfig(fftw3f)
|
||||
BuildRequires: pkgconfig(libosmocoding) >= 1.9.0
|
||||
BuildRequires: pkgconfig(libosmocore) >= 1.9.0
|
||||
BuildRequires: pkgconfig(libosmoctrl) >= 1.9.0
|
||||
BuildRequires: pkgconfig(libosmovty) >= 1.9.0
|
||||
BuildRequires: pkgconfig(libusb-1.0)
|
||||
BuildRequires: pkgconfig(uhd)
|
||||
%{?systemd_requires}
|
||||
%if 0%{?suse_version} > 1325
|
||||
BuildRequires: libboost_program_options-devel
|
||||
BuildRequires: libboost_system-devel
|
||||
BuildRequires: libboost_test-devel
|
||||
BuildRequires: libboost_thread-devel
|
||||
%else
|
||||
BuildRequires: boost-devel
|
||||
%endif
|
||||
|
||||
%description
|
||||
OsmoTRX is a software-defined radio transceiver that implements the Layer 1
|
||||
physical layer of a BTS comprising the following 3GPP specifications:
|
||||
|
||||
TS 05.01 "Physical layer on the radio path"
|
||||
TS 05.02 "Multiplexing and Multiple Access on the Radio Path"
|
||||
TS 05.04 "Modulation"
|
||||
TS 05.10 "Radio subsystem synchronization"
|
||||
|
||||
In this context, BTS is "Base transceiver station". It's the stations that
|
||||
connect mobile phones to the mobile network.
|
||||
|
||||
3GPP is the "3rd Generation Partnership Project" which is the collaboration
|
||||
between different telecommunication associations for developing new
|
||||
generations of mobile phone networks. (post-2G/GSM)
|
||||
|
||||
%package uhd
|
||||
Summary: SDR transceiver that implements Layer 1 of a GSM BTS (UHD)
|
||||
Group: Productivity/Telephony/Servers
|
||||
Requires: uhd-firmware
|
||||
|
||||
%description uhd
|
||||
OsmoTRX is a software-defined radio transceiver that implements the Layer 1
|
||||
physical layer of a BTS comprising the following 3GPP specifications:
|
||||
|
||||
TS 05.01 "Physical layer on the radio path"
|
||||
TS 05.02 "Multiplexing and Multiple Access on the Radio Path"
|
||||
TS 05.04 "Modulation"
|
||||
TS 05.10 "Radio subsystem synchronization"
|
||||
|
||||
In this context, BTS is "Base transceiver station". It's the stations that
|
||||
connect mobile phones to the mobile network.
|
||||
|
||||
3GPP is the "3rd Generation Partnership Project" which is the collaboration
|
||||
between different telecommunication associations for developing new
|
||||
generations of mobile phone networks. (post-2G/GSM)
|
||||
|
||||
%if ! 0%{?centos_ver}
|
||||
%package usrp1
|
||||
Summary: SDR transceiver that implements Layer 1 of a GSM BTS (USRP1)
|
||||
Group: Productivity/Telephony/Servers
|
||||
|
||||
%description usrp1
|
||||
OsmoTRX is a software-defined radio transceiver that implements the Layer 1
|
||||
physical layer of a BTS comprising the following 3GPP specifications:
|
||||
|
||||
TS 05.01 "Physical layer on the radio path"
|
||||
TS 05.02 "Multiplexing and Multiple Access on the Radio Path"
|
||||
TS 05.04 "Modulation"
|
||||
TS 05.10 "Radio subsystem synchronization"
|
||||
|
||||
In this context, BTS is "Base transceiver station". It's the stations that
|
||||
connect mobile phones to the mobile network.
|
||||
|
||||
3GPP is the "3rd Generation Partnership Project" which is the collaboration
|
||||
between different telecommunication associations for developing new
|
||||
generations of mobile phone networks. (post-2G/GSM)
|
||||
|
||||
%package lms
|
||||
Summary: SDR transceiver that implements Layer 1 of a GSM BTS (LimeSuite)
|
||||
Group: Productivity/Telephony/Servers
|
||||
|
||||
%description lms
|
||||
OsmoTRX is a software-defined radio transceiver that implements the Layer 1
|
||||
physical layer of a BTS comprising the following 3GPP specifications:
|
||||
|
||||
TS 05.01 "Physical layer on the radio path"
|
||||
TS 05.02 "Multiplexing and Multiple Access on the Radio Path"
|
||||
TS 05.04 "Modulation"
|
||||
TS 05.10 "Radio subsystem synchronization"
|
||||
|
||||
In this context, BTS is "Base transceiver station". It's the stations that
|
||||
connect mobile phones to the mobile network.
|
||||
|
||||
3GPP is the "3rd Generation Partnership Project" which is the collaboration
|
||||
between different telecommunication associations for developing new
|
||||
generations of mobile phone networks. (post-2G/GSM)
|
||||
%endif
|
||||
|
||||
%package ipc
|
||||
Summary: SDR transceiver that implements Layer 1 of a GSM BTS (IPC)
|
||||
Group: Productivity/Telephony/Servers
|
||||
|
||||
%description ipc
|
||||
OsmoTRX is a software-defined radio transceiver that implements the Layer 1
|
||||
physical layer of a BTS comprising the following 3GPP specifications:
|
||||
|
||||
TS 05.01 "Physical layer on the radio path"
|
||||
TS 05.02 "Multiplexing and Multiple Access on the Radio Path"
|
||||
TS 05.04 "Modulation"
|
||||
TS 05.10 "Radio subsystem synchronization"
|
||||
|
||||
In this context, BTS is "Base transceiver station". It's the stations that
|
||||
connect mobile phones to the mobile network.
|
||||
|
||||
3GPP is the "3rd Generation Partnership Project" which is the collaboration
|
||||
between different telecommunication associations for developing new
|
||||
generations of mobile phone networks. (post-2G/GSM)
|
||||
|
||||
%package ipc-test
|
||||
Summary: SDR transceiver that implements Layer 1 of a GSM BTS (IPC) driver test utility
|
||||
Group: Productivity/Telephony/Servers
|
||||
|
||||
%description ipc-test
|
||||
OsmoTRX is a software-defined radio transceiver that implements the Layer 1
|
||||
physical layer of a BTS comprising the following 3GPP specifications:
|
||||
|
||||
This package include the test tools for osmo-trx-ipc
|
||||
|
||||
%prep
|
||||
%setup -q
|
||||
|
||||
%build
|
||||
echo "%{version}" >.tarball-version
|
||||
autoreconf -fi
|
||||
|
||||
%if 0%{?centos_ver}
|
||||
%configure \
|
||||
--docdir=%{_docdir}/%{name} \
|
||||
--with-systemdsystemunitdir=%{_unitdir} \
|
||||
--without-lms \
|
||||
--with-uhd \
|
||||
--without-usrp1 \
|
||||
--with-ipc
|
||||
%else
|
||||
%configure \
|
||||
--docdir=%{_docdir}/%{name} \
|
||||
--with-systemdsystemunitdir=%{_unitdir} \
|
||||
--with-lms \
|
||||
--with-uhd \
|
||||
--with-usrp1 \
|
||||
--with-ipc
|
||||
%endif
|
||||
|
||||
make %{?_smp_mflags} V=1
|
||||
|
||||
%check
|
||||
make %{?_smp_mflags} check || (find . -name testsuite.log -exec cat {} +)
|
||||
|
||||
%install
|
||||
%make_install
|
||||
%fdupes -s %{buildroot}/%{_datadir}
|
||||
|
||||
%if 0%{?suse_version}
|
||||
%pre lms %service_add_pre osmo-trx-lms.service
|
||||
%post lms %service_add_post osmo-trx-lms.service
|
||||
%preun lms %service_del_preun osmo-trx-lms.service
|
||||
%postun lms %service_del_postun osmo-trx-lms.service
|
||||
%pre uhd %service_add_pre osmo-trx-uhd.service
|
||||
%post uhd %service_add_post osmo-trx-uhd.service
|
||||
%preun uhd %service_del_preun osmo-trx-uhd.service
|
||||
%postun uhd %service_del_postun osmo-trx-uhd.service
|
||||
%pre usrp1 %service_add_pre osmo-trx-usrp1.service
|
||||
%post usrp1 %service_add_post osmo-trx-usrp1.service
|
||||
%preun usrp1 %service_del_preun osmo-trx-usrp1.service
|
||||
%postun usrp1 %service_del_postun osmo-trx-usrp1.service
|
||||
%pre ipc %service_add_pre osmo-trx-ipc.service
|
||||
%post ipc %service_add_post osmo-trx-ipc.service
|
||||
%preun ipc %service_del_preun osmo-trx-ipc.service
|
||||
%postun ipc %service_del_postun osmo-trx-ipc.service
|
||||
%endif
|
||||
|
||||
%files
|
||||
%license COPYING
|
||||
%doc README.md
|
||||
%doc %{_docdir}/%{name}/examples
|
||||
|
||||
%if ! 0%{?centos_ver}
|
||||
%files lms
|
||||
%{_bindir}/osmo-trx-lms
|
||||
%dir %{_sysconfdir}/osmocom
|
||||
%config(noreplace) %{_sysconfdir}/osmocom/osmo-trx-lms.cfg
|
||||
%{_unitdir}/osmo-trx-lms.service
|
||||
%endif
|
||||
|
||||
%files uhd
|
||||
%{_bindir}/osmo-trx-uhd
|
||||
%dir %{_sysconfdir}/osmocom
|
||||
%config(noreplace) %{_sysconfdir}/osmocom/osmo-trx-uhd.cfg
|
||||
%{_unitdir}/osmo-trx-uhd.service
|
||||
|
||||
%if ! 0%{?centos_ver}
|
||||
%files usrp1
|
||||
%{_bindir}/osmo-trx-usrp1
|
||||
%dir %{_datadir}/usrp
|
||||
%dir %{_datadir}/usrp/rev2
|
||||
%dir %{_datadir}/usrp/rev4
|
||||
%{_datadir}/usrp/rev2/std_inband.rbf
|
||||
%{_datadir}/usrp/rev4/std_inband.rbf
|
||||
%{_unitdir}/osmo-trx-usrp1.service
|
||||
%endif
|
||||
|
||||
%files ipc
|
||||
%{_bindir}/osmo-trx-ipc
|
||||
%dir %{_sysconfdir}/osmocom
|
||||
%config(noreplace) %{_sysconfdir}/osmocom/osmo-trx-ipc.cfg
|
||||
%{_unitdir}/osmo-trx-ipc.service
|
||||
|
||||
%files ipc-test
|
||||
%{_bindir}/ipc-driver-test
|
||||
|
||||
%changelog
|
@@ -8,8 +8,11 @@ Type=simple
|
||||
Restart=always
|
||||
StateDirectory=osmocom
|
||||
WorkingDirectory=%S/osmocom
|
||||
User=osmocom
|
||||
Group=osmocom
|
||||
ExecStart=/usr/bin/osmo-trx-ipc -C /etc/osmocom/osmo-trx-ipc.cfg
|
||||
RestartSec=2
|
||||
AmbientCapabilities=CAP_SYS_NICE
|
||||
# CPU scheduling policy:
|
||||
CPUSchedulingPolicy=rr
|
||||
# For real-time scheduling policies an integer between 1 (lowest priority) and 99 (highest priority):
|
||||
|
@@ -8,8 +8,11 @@ Type=simple
|
||||
Restart=always
|
||||
StateDirectory=osmocom
|
||||
WorkingDirectory=%S/osmocom
|
||||
User=osmocom
|
||||
Group=osmocom
|
||||
ExecStart=/usr/bin/osmo-trx-lms -C /etc/osmocom/osmo-trx-lms.cfg
|
||||
RestartSec=2
|
||||
AmbientCapabilities=CAP_SYS_NICE
|
||||
# CPU scheduling policy:
|
||||
CPUSchedulingPolicy=rr
|
||||
# For real-time scheduling policies an integer between 1 (lowest priority) and 99 (highest priority):
|
||||
|
@@ -8,9 +8,12 @@ Type=simple
|
||||
Restart=always
|
||||
StateDirectory=osmocom
|
||||
WorkingDirectory=%S/osmocom
|
||||
Environment=HOME=%h
|
||||
Environment=HOME=%S/osmocom
|
||||
User=osmocom
|
||||
Group=osmocom
|
||||
ExecStart=/usr/bin/osmo-trx-uhd -C /etc/osmocom/osmo-trx-uhd.cfg
|
||||
RestartSec=2
|
||||
AmbientCapabilities=CAP_SYS_NICE
|
||||
# CPU scheduling policy:
|
||||
CPUSchedulingPolicy=rr
|
||||
# For real-time scheduling policies an integer between 1 (lowest priority) and 99 (highest priority):
|
||||
|
@@ -8,8 +8,11 @@ Type=simple
|
||||
Restart=always
|
||||
StateDirectory=osmocom
|
||||
WorkingDirectory=%S/osmocom
|
||||
User=osmocom
|
||||
Group=osmocom
|
||||
ExecStart=/usr/bin/osmo-trx-usrp1 -C /etc/osmocom/osmo-trx-usrp1.cfg
|
||||
RestartSec=2
|
||||
AmbientCapabilities=CAP_SYS_NICE
|
||||
# CPU scheduling policy:
|
||||
CPUSchedulingPolicy=rr
|
||||
# For real-time scheduling policies an integer between 1 (lowest priority) and 99 (highest priority):
|
||||
|
52
debian/changelog
vendored
52
debian/changelog
vendored
@@ -1,3 +1,55 @@
|
||||
osmo-trx (1.7.0) unstable; urgency=medium
|
||||
|
||||
[ Eric ]
|
||||
* ms: adjust ts advance
|
||||
* ms: reduce rx burst queue size
|
||||
* ms: init blade with fpga control
|
||||
* devices: fix wrong gain to power mapping
|
||||
* ms: get rid of std::thread
|
||||
* ms: add demod test tool and data
|
||||
|
||||
[ Vadim Yanitskiy ]
|
||||
* osmo-trx-ms: bump osmocom-bb submodule commit
|
||||
* Transceiver::ctrl_sock_handle_rx(): fix copy-pasted comments
|
||||
* build: include version files into the release tarball
|
||||
* doc/examples: fix missing config files in release tarballs
|
||||
* README.md: cosmetic: fix a typo
|
||||
|
||||
[ Harald Welte ]
|
||||
* osmo-trx-uhd: Make sure HOME environment variable is set
|
||||
* README.md: Improve markdown formatting
|
||||
* README.md: Add Forum and Issue Tracker links
|
||||
* Add funding link to github mirror
|
||||
* README.md: Remove stray apostrophe
|
||||
|
||||
[ Andreas Eversberg ]
|
||||
* Use uniform log format for default config files
|
||||
|
||||
[ Eric Wild ]
|
||||
* ms: do not set the blade tuning mode
|
||||
* ms: hard preswapped VA gsm bits
|
||||
* ms: add sigproclib demod
|
||||
* ms: fix up template deduction failure
|
||||
* ms: update osmocom-bb submodule
|
||||
* ms: disabe uhd ms build
|
||||
* transceiver: use log level cache
|
||||
|
||||
[ Oliver Smith ]
|
||||
* gitignore: add .version
|
||||
* debian/rules: make configure args diff friendly
|
||||
* debian: add osmo-trx-ms-blade
|
||||
* contrib/jenkins: make configure args diff friendly
|
||||
* contrib/jenkins: add --with-bladerf
|
||||
* contrib: remove rpm spec file
|
||||
* contrib/systemd: run as osmocom user
|
||||
* contrib/systemd/osmo-trx-uhd: fix HOME=
|
||||
|
||||
[ Pau Espin Pedrol ]
|
||||
* code-architecture.adoc: Fix missing alignment in digraph
|
||||
* doc: Introduce documentation for osmo-trx-ipc and its IPC interface
|
||||
|
||||
-- Oliver Smith <osmith@sysmocom.de> Wed, 24 Jul 2024 15:57:14 +0200
|
||||
|
||||
osmo-trx (1.6.0) unstable; urgency=medium
|
||||
|
||||
[ Vadim Yanitskiy ]
|
||||
|
4
debian/control
vendored
4
debian/control
vendored
@@ -15,8 +15,8 @@ Build-Depends: debhelper (>= 10),
|
||||
libusrp-dev,
|
||||
liblimesuite-dev,
|
||||
libbladerf-dev,
|
||||
libosmocore-dev (>= 1.9.0),
|
||||
osmo-gsm-manuals-dev (>= 1.5.0)
|
||||
libosmocore-dev (>= 1.10.0),
|
||||
osmo-gsm-manuals-dev (>= 1.6.0)
|
||||
Standards-Version: 3.9.6
|
||||
Vcs-Browser: https://gitea.osmocom.org/cellular-infrastructure/osmo-trx
|
||||
Vcs-Git: https://gitea.osmocom.org/cellular-infrastructure/osmo-trx
|
||||
|
38
debian/osmo-trx-ipc.postinst
vendored
Executable file
38
debian/osmo-trx-ipc.postinst
vendored
Executable file
@@ -0,0 +1,38 @@
|
||||
#!/bin/sh -e
|
||||
case "$1" in
|
||||
configure)
|
||||
# Create the osmocom group and user (if it doesn't exist yet)
|
||||
if ! getent group osmocom >/dev/null; then
|
||||
groupadd --system osmocom
|
||||
fi
|
||||
if ! getent passwd osmocom >/dev/null; then
|
||||
useradd \
|
||||
--system \
|
||||
--gid osmocom \
|
||||
--home-dir /var/lib/osmocom \
|
||||
--shell /sbin/nologin \
|
||||
--comment "Open Source Mobile Communications" \
|
||||
osmocom
|
||||
fi
|
||||
|
||||
# Fix permissions of previous (root-owned) install (OS#4107)
|
||||
if dpkg --compare-versions "$2" le "1.13.0"; then
|
||||
if [ -e /etc/osmocom/osmo-trx-ipc.cfg ]; then
|
||||
chown -v osmocom:osmocom /etc/osmocom/osmo-trx-ipc.cfg
|
||||
chmod -v 0660 /etc/osmocom/osmo-trx-ipc.cfg
|
||||
fi
|
||||
|
||||
if [ -d /etc/osmocom ]; then
|
||||
chown -v root:osmocom /etc/osmocom
|
||||
chmod -v 2775 /etc/osmocom
|
||||
fi
|
||||
|
||||
mkdir -p /var/lib/osmocom
|
||||
chown -R -v osmocom:osmocom /var/lib/osmocom
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
|
||||
# dh_installdeb(1) will replace this with shell code automatically
|
||||
# generated by other debhelper scripts.
|
||||
#DEBHELPER#
|
38
debian/osmo-trx-lms.postinst
vendored
Executable file
38
debian/osmo-trx-lms.postinst
vendored
Executable file
@@ -0,0 +1,38 @@
|
||||
#!/bin/sh -e
|
||||
case "$1" in
|
||||
configure)
|
||||
# Create the osmocom group and user (if it doesn't exist yet)
|
||||
if ! getent group osmocom >/dev/null; then
|
||||
groupadd --system osmocom
|
||||
fi
|
||||
if ! getent passwd osmocom >/dev/null; then
|
||||
useradd \
|
||||
--system \
|
||||
--gid osmocom \
|
||||
--home-dir /var/lib/osmocom \
|
||||
--shell /sbin/nologin \
|
||||
--comment "Open Source Mobile Communications" \
|
||||
osmocom
|
||||
fi
|
||||
|
||||
# Fix permissions of previous (root-owned) install (OS#4107)
|
||||
if dpkg --compare-versions "$2" le "1.13.0"; then
|
||||
if [ -e /etc/osmocom/osmo-trx-lms.cfg ]; then
|
||||
chown -v osmocom:osmocom /etc/osmocom/osmo-trx-lms.cfg
|
||||
chmod -v 0660 /etc/osmocom/osmo-trx-lms.cfg
|
||||
fi
|
||||
|
||||
if [ -d /etc/osmocom ]; then
|
||||
chown -v root:osmocom /etc/osmocom
|
||||
chmod -v 2775 /etc/osmocom
|
||||
fi
|
||||
|
||||
mkdir -p /var/lib/osmocom
|
||||
chown -R -v osmocom:osmocom /var/lib/osmocom
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
|
||||
# dh_installdeb(1) will replace this with shell code automatically
|
||||
# generated by other debhelper scripts.
|
||||
#DEBHELPER#
|
38
debian/osmo-trx-uhd.postinst
vendored
Executable file
38
debian/osmo-trx-uhd.postinst
vendored
Executable file
@@ -0,0 +1,38 @@
|
||||
#!/bin/sh -e
|
||||
case "$1" in
|
||||
configure)
|
||||
# Create the osmocom group and user (if it doesn't exist yet)
|
||||
if ! getent group osmocom >/dev/null; then
|
||||
groupadd --system osmocom
|
||||
fi
|
||||
if ! getent passwd osmocom >/dev/null; then
|
||||
useradd \
|
||||
--system \
|
||||
--gid osmocom \
|
||||
--home-dir /var/lib/osmocom \
|
||||
--shell /sbin/nologin \
|
||||
--comment "Open Source Mobile Communications" \
|
||||
osmocom
|
||||
fi
|
||||
|
||||
# Fix permissions of previous (root-owned) install (OS#4107)
|
||||
if dpkg --compare-versions "$2" le "1.13.0"; then
|
||||
if [ -e /etc/osmocom/osmo-trx-uhd.cfg ]; then
|
||||
chown -v osmocom:osmocom /etc/osmocom/osmo-trx-uhd.cfg
|
||||
chmod -v 0660 /etc/osmocom/osmo-trx-uhd.cfg
|
||||
fi
|
||||
|
||||
if [ -d /etc/osmocom ]; then
|
||||
chown -v root:osmocom /etc/osmocom
|
||||
chmod -v 2775 /etc/osmocom
|
||||
fi
|
||||
|
||||
mkdir -p /var/lib/osmocom
|
||||
chown -R -v osmocom:osmocom /var/lib/osmocom
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
|
||||
# dh_installdeb(1) will replace this with shell code automatically
|
||||
# generated by other debhelper scripts.
|
||||
#DEBHELPER#
|
38
debian/osmo-trx-usrp1.postinst
vendored
Executable file
38
debian/osmo-trx-usrp1.postinst
vendored
Executable file
@@ -0,0 +1,38 @@
|
||||
#!/bin/sh -e
|
||||
case "$1" in
|
||||
configure)
|
||||
# Create the osmocom group and user (if it doesn't exist yet)
|
||||
if ! getent group osmocom >/dev/null; then
|
||||
groupadd --system osmocom
|
||||
fi
|
||||
if ! getent passwd osmocom >/dev/null; then
|
||||
useradd \
|
||||
--system \
|
||||
--gid osmocom \
|
||||
--home-dir /var/lib/osmocom \
|
||||
--shell /sbin/nologin \
|
||||
--comment "Open Source Mobile Communications" \
|
||||
osmocom
|
||||
fi
|
||||
|
||||
# Fix permissions of previous (root-owned) install (OS#4107)
|
||||
if dpkg --compare-versions "$2" le "1.13.0"; then
|
||||
if [ -e /etc/osmocom/osmo-trx-usrp1.cfg ]; then
|
||||
chown -v osmocom:osmocom /etc/osmocom/osmo-trx-usrp1.cfg
|
||||
chmod -v 0660 /etc/osmocom/osmo-trx-usrp1.cfg
|
||||
fi
|
||||
|
||||
if [ -d /etc/osmocom ]; then
|
||||
chown -v root:osmocom /etc/osmocom
|
||||
chmod -v 2775 /etc/osmocom
|
||||
fi
|
||||
|
||||
mkdir -p /var/lib/osmocom
|
||||
chown -R -v osmocom:osmocom /var/lib/osmocom
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
|
||||
# dh_installdeb(1) will replace this with shell code automatically
|
||||
# generated by other debhelper scripts.
|
||||
#DEBHELPER#
|
@@ -9,7 +9,7 @@ digraph hierarchy {
|
||||
node[shape=record,style=filled,fillcolor=gray95]
|
||||
edge[dir=back, arrowtail=empty]
|
||||
|
||||
2[label = "{Transceiver|+ constructor()\l+ destructor()\l+ init()\l+ numChans()\l+ receiveFIFO()\l+ setSignalHandler()}"]
|
||||
2[label = "{Transceiver|+ constructor()\l+ destructor()\l+ init()\l+ numChans()\l+ receiveFIFO()\l+ setSignalHandler()\l}"]
|
||||
3[label = "{RadioInterface|...}"]
|
||||
4[label = "{RadioInterfaceResamp|...}"]
|
||||
5[label = "{RadioInterfaceMulti|...}"]
|
||||
@@ -17,6 +17,7 @@ edge[dir=back, arrowtail=empty]
|
||||
7[label = "{UHDDevice|...}"]
|
||||
8[label = "{LMSDevice|...}"]
|
||||
9[label = "{USRPDevice|...}"]
|
||||
10[label = "{IPCDevice|...}"]
|
||||
|
||||
2->3[arrowtail=odiamond]
|
||||
3->4[constraint=false]
|
||||
@@ -25,6 +26,7 @@ edge[dir=back, arrowtail=empty]
|
||||
6->7
|
||||
6->8
|
||||
6->9
|
||||
6->10
|
||||
}
|
||||
----
|
||||
|
||||
|
301
doc/manuals/chapters/ipc_if.adoc
Normal file
301
doc/manuals/chapters/ipc_if.adoc
Normal file
@@ -0,0 +1,301 @@
|
||||
[[ipc_if]]
|
||||
== osmo-trx-ipc IPC Interface
|
||||
|
||||
This interface is the one used by _osmo_trx_ipc_ backend to communicate to a
|
||||
third party process in charge of driving the lowest layer device-specific bits
|
||||
(from now on the Driver).
|
||||
|
||||
It consists of a set of Unix Domain (UD) sockets for the control plane, plus a
|
||||
shared memory region for the data plane.
|
||||
|
||||
Related code can be found in the
|
||||
https://gitea.osmocom.org/cellular-infrastructure/osmo-trx/src/branch/master/Transceiver52M/device/ipc[Transceiver52M/device/ipc/]
|
||||
directory in _osmo-trx.git_.
|
||||
|
||||
If you are a potential driver implementator, the
|
||||
various primitives and data structures are publicly available in header file
|
||||
https://gitea.osmocom.org/cellular-infrastructure/osmo-trx/src/branch/master/Transceiver52M/device/ipc/shm.h[Transceiver52M/device/ipc/shm.h].
|
||||
|
||||
=== Control plane
|
||||
|
||||
Control plane protocol is transmitted over Unix Domain (UD) sockets using
|
||||
message based primitives. Each primitive has a type identified by an integer,
|
||||
and each type of primitive has a number of extra attributes attached to it. The
|
||||
IPC interface consists of 2 types of UD sockets:
|
||||
|
||||
* _Master_ UD socket: One per osmo-trx-ipc process.
|
||||
|
||||
* _Channel_ UD socket: One for each channel managed by osmo-trx-ipc process.
|
||||
|
||||
The _Driver_ is in all cases expected to take the server role when creating UD
|
||||
sockets, while _osmo-trx-ipc_ takes the client role and connects to sockets
|
||||
provided by the driver.
|
||||
|
||||
=== Master UD socket
|
||||
|
||||
During startup, _osmo-trx-ipc_ will try connecting to the _Driver_ Master UD
|
||||
socket located in the path provided by its own (VTY) configuration. As a result,
|
||||
it means the _Driver_ process must be running and listening on the Master UD
|
||||
socket before _osmo-trx-ipc_ is started, otherwise _osmo-trx-ipc_ will fail and
|
||||
exit.
|
||||
|
||||
Once connected, _osmo-trx-ipc_ will submit a `GREETING_REQ` message primitive
|
||||
announcing the maximum supported protocol version (first version ever is `1`,
|
||||
increasing over time).
|
||||
|
||||
The _Driver_ shall then answer in `GREETING_CNF` message primitive with its own
|
||||
maximum supported version (`<=` version received), providing 0 if none is
|
||||
supported.
|
||||
|
||||
If _osmo-trx-ipc_ receives back the requested version, then both sides agreed
|
||||
on the protocol version to use.
|
||||
If _osmo-trx-ipc_ receives back a lower version, it shall decide to continue
|
||||
with version negotiation using a lower version, until a supported version or 0
|
||||
is received. If finally 0 is received, _osmo-trx-ipc_ will disconnect and exit
|
||||
with failure.
|
||||
|
||||
Once the version is negotiated (`v1` as of current date), _osmo-trx-ipc_ will
|
||||
ask for device information and available characeristics to the _Driver_ using
|
||||
the `INFO_REQ` message primitive.
|
||||
|
||||
The _Driver_ shall then answer with a `INFO_CNF` message
|
||||
containing information, such as:
|
||||
|
||||
* String containing device description
|
||||
|
||||
* Available reference clocks,
|
||||
|
||||
* {rx,tx} I/Q scaling factors
|
||||
|
||||
* Maximum number of channels supported
|
||||
|
||||
* for each channel:
|
||||
|
||||
** List of available {rx,tx} paths/antennas.
|
||||
|
||||
** {min,max}{rx,tx} gains
|
||||
|
||||
** Nominal transmit power
|
||||
|
||||
All the information received from the _Driver_ during `INFO_CNF` will be used by
|
||||
_osmo-trx-ipc_ to decide whether it can fullfil the requested configuration from
|
||||
the user, and proceed to open the device, or exit with a failure (for instance
|
||||
number of channels, referece clock or tx/rx antenna selected by the user cannot
|
||||
be fullfilled).
|
||||
|
||||
_osmo-trx-ipc_ will then proceed to open the device and do an initial
|
||||
configuration using an `OPEN_REQ` message, where it will provide the _Driver_
|
||||
with the desired selected configuration (such as number of channels, rx/tx
|
||||
paths, clock reference, bandwidth filters, etc.).
|
||||
|
||||
The _Driver_ shall then configure the device and send back a `OPEN_CNF` with:
|
||||
|
||||
* `return_code` integer attribute set to `0` on success or `!0` on error.
|
||||
|
||||
* Name of the Posix Shared Memory region where data plane is going to be
|
||||
transmitted.
|
||||
|
||||
* One path for each channel, containing the just-created UD socket to manage
|
||||
that channel (for instance by taking Master UD socket path and appending
|
||||
`_$chan_idx`).
|
||||
|
||||
* Path Delay: this is the loopback path delay in samples (= used as a timestamp
|
||||
offset internally by _osmo-trx-ipc_), this value contains the analog delay as
|
||||
well as the delay introduced by the digital filters in the fpga in the sdr
|
||||
devices, and is therefore device type and bandwidth/sample rate dependant. This
|
||||
can not be omitted, wrong values will lead to a _osmo-trx-ipc_ that just doesn't
|
||||
detect any bursts.
|
||||
|
||||
Finally, _osmo-trx-ipc_ will connect to each channel's UD socket (see next
|
||||
section).
|
||||
|
||||
Upon _osmo-trx-ipc_ closing the UD master socket connection, the _Driver_ shall
|
||||
go into _closed_ state: stop all processing and instruct the device to power
|
||||
off.
|
||||
|
||||
TIP: See
|
||||
https://gitea.osmocom.org/cellular-infrastructure/osmo-trx/src/branch/master/Transceiver52M/device/ipc/shm.h[Transceiver52M/device/ipc/shm.h]
|
||||
for the detailed definition of all the related message primitives and data
|
||||
types for this socket.
|
||||
|
||||
=== Channel UD Socket
|
||||
|
||||
This socket can be used by _osmo-trx-ipc_ to start/stop data plane processing or
|
||||
change channel's parameters such as Rx/Tx Frequency, Rx/Tx gains, etc.
|
||||
|
||||
A channel can be either in _started_ or _stopped_ state. When a channel is
|
||||
created (during `OPEN_REQ` in the Master UD Socket), it's by default in
|
||||
_stopped_ state. `START_REQ` and `STOP_REQ` messages control this state, and
|
||||
eventual failures can be reported through `START_CNF` and `STOP_CNF` by the
|
||||
_Driver_.
|
||||
|
||||
The message `START_REQ` instructs the _Driver_ to start processing data in the
|
||||
data plane. Similary, `STOP_REQ` instructs the _Driver_ to stop processing data
|
||||
in the data plane.
|
||||
|
||||
Some parameters are usually changed only when the channel is in stopped mode,
|
||||
for instance Rx/Tx Frequency.
|
||||
|
||||
TIP: See
|
||||
https://gitea.osmocom.org/cellular-infrastructure/osmo-trx/src/branch/master/Transceiver52M/device/ipc/shm.h[Transceiver52M/device/ipc/shm.h]
|
||||
for the detailed definition of all the related message primitives and data
|
||||
types for this socket.
|
||||
|
||||
=== Data Plane
|
||||
|
||||
Data plane protocol is implemented by means of a ring buffer structure on top of
|
||||
Posix Shared Memory (see `man 7 shm_overview`) between _osmo-trx-ipc_ process
|
||||
and the _Driver_.
|
||||
|
||||
The Posix Shared Memory region is created and its memory structure prepared by
|
||||
the _Driver_ and its name shared with _osmo-trx-ipc_ during _OPEN_CNF_ message
|
||||
in the Master UD Socket from the Control Plane. Resource allocation for the
|
||||
shared memory area and cleanup is up to the ipc server, as is mutex
|
||||
initialization for the buffers.
|
||||
|
||||
==== Posix Shared Memory structure
|
||||
|
||||
[[fig-shm-structure]]
|
||||
.General overview of Posix Shared Memory structure
|
||||
[graphviz]
|
||||
----
|
||||
digraph hierarchy {
|
||||
node[shape=record,style=filled,fillcolor=gray95]
|
||||
edge[dir=back, arrowtail=empty]
|
||||
|
||||
SHM[label = "{Posix Shared Memory region|+ num_chans\l+ Channels[]\l}"]
|
||||
CHAN0[label = "{Channel 0|...}"]
|
||||
CHAN1[label = "{Channel 1|...}"]
|
||||
CHANN[label = "{Channel ...|}"]
|
||||
STREAM0_UL[label = "{UL Stream|+ semaphore\l+ read_next\l+ write_next\l+ buffer_size /* In samples */\l+ num_buffers\l+ sample_buffers[]\l}"]
|
||||
STREAM0_DL[label = "{DL Stream|+ semaphore\l+ read_next\l+ write_next\l+ buffer_size /* In samples */\l+ num_buffers\l+ sample_buffers[]\l}"]
|
||||
STREAM1_UL[label = "{UL Stream|...}"]
|
||||
STREAM1_DL[label = "{DL Stream|...}"]
|
||||
STREAMN_UL[label = "{UL Stream|...}"]
|
||||
STREAMN_DL[label = "{DL Stream|...}"]
|
||||
BUF_0DL0[label = "{DL Sample Buffer 0|+ timestamp\l+ buffer_size /* In samples */\l+ samples[] = [16bit I + 16bit Q,...]\l}"]
|
||||
BUF_0DLN[label = "{DL Sample Buffer ....|...}"]
|
||||
BUF_0UL0[label = "{UL Sample Buffer 0|+ timestamp\l+ buffer_size /* In samples */\l+ samples[] = [16bit I + 16bit Q,...]\l}"]
|
||||
BUF_0ULN[label = "{UL Sample Buffer ...|...}"]
|
||||
|
||||
SHM->CHAN0
|
||||
SHM->CHAN1
|
||||
SHM->CHANN
|
||||
|
||||
CHAN0->STREAM0_DL
|
||||
CHAN0->STREAM0_UL
|
||||
STREAM0_DL->BUF_0DL0
|
||||
STREAM0_DL->BUF_0DLN
|
||||
STREAM0_UL->BUF_0UL0
|
||||
STREAM0_UL->BUF_0ULN
|
||||
|
||||
CHAN1->STREAM1_UL
|
||||
CHAN1->STREAM1_DL
|
||||
|
||||
CHANN->STREAMN_UL
|
||||
CHANN->STREAMN_DL
|
||||
}
|
||||
----
|
||||
|
||||
The Posix Shared Memory region contains an array of _Channels_.
|
||||
|
||||
Each _Channel_ contains 2 Streams:
|
||||
|
||||
* Downlink _Stream_
|
||||
|
||||
* Uplink _Stream_
|
||||
|
||||
Each _Stream_ handles a ring buffer, which is implemented as:
|
||||
|
||||
* An array of pointers to _Sample Buffer_ structures.
|
||||
|
||||
* Variables containing the number of buffers in the array, as well as the
|
||||
maximum size in samples for each Sample Buffer.
|
||||
|
||||
* Variables containing `next_read` and `next_write` _Sample Buffer_ (its index
|
||||
in the array of pointers).
|
||||
|
||||
* Unnamed Posix semaphores to do the required locking while using the ring
|
||||
buffer.
|
||||
|
||||
Each _Sample Buffer_ contains:
|
||||
|
||||
* A `timestamp` variable, containing the position in the stream of the first
|
||||
sample in the buffer
|
||||
|
||||
* A `data_len` variable, containing the amount of samples available to process
|
||||
in the buffer
|
||||
|
||||
* An array of samples of size specified by the stream struct it is part of.
|
||||
|
||||
==== Posix Shared Memory format
|
||||
|
||||
The Posix Shared memory region shall be formatted applying the following
|
||||
considerations:
|
||||
|
||||
* All pointers in the memory region are encoded as offsets from the start
|
||||
address of the region itself, to allow different processes with different
|
||||
address spaces to decode them.
|
||||
|
||||
* All structs must be force-aligned to 8 bytes
|
||||
|
||||
* Number of buffers must be power of 2 (2,4,8,16,...) - 4 appears to be plenty
|
||||
|
||||
* IQ samples format: One (complex) sample consists of 16bit i + 16bit q, so the
|
||||
buffer size is number of IQ pairs.
|
||||
|
||||
* A reasonable per-buffer size (in samples) is 2500, since this happens to be
|
||||
the ususal TX (downlink) buffer size used by _osmo-trx-ipc_ with the b210 (rx
|
||||
over-the-wire packet size for the b210 is 2040 samples, so the larger value of
|
||||
both is convenient).
|
||||
|
||||
TIP: See
|
||||
https://gitea.osmocom.org/cellular-infrastructure/osmo-trx/src/branch/master/Transceiver52M/device/ipc/shm.h[Transceiver52M/device/ipc/shm.h]
|
||||
for the detailed definition of all the objects being part of the Posix Shared
|
||||
memory region structure
|
||||
|
||||
==== Posix Shared Memory procedures
|
||||
|
||||
The queue in the shared memory area is not supposed to be used for actual
|
||||
buffering of data, only for exchange, so the general expectation is that it is
|
||||
mostly empty. The only exception to that might be minor processing delays, and
|
||||
during startup.
|
||||
|
||||
Care must be taken to ensure that only timed waits for the mutex protecting it
|
||||
and the condition variables are used, in order to ensure that no deadlock occurs
|
||||
should the other side die/quit.
|
||||
|
||||
Thread cancellation should be disabled during reads/writes from/to the queue. In
|
||||
general a timeout can be considered a non recoverable error during regular
|
||||
processing after startup, at least with the current timeout value of one second.
|
||||
|
||||
Should over- or underflows occur a corresponding message should be sent towards
|
||||
_osmo-trx-ipc_.
|
||||
|
||||
Upon **read** of `N` samples, the reader does something like:
|
||||
|
||||
. Acquire the semaphore in the channel's stream object.
|
||||
|
||||
. Read `stream->next_read`, if `next_read==next_write`, become blocked in
|
||||
another sempahore (unlocking the previous one) until writer signals us, then
|
||||
`buff = stream->buffers[next_read]`
|
||||
|
||||
. Read `buff->data_len` samples, reset the buffer data (`data_len=0`),
|
||||
increment `next_read` and if read samples is `<N`, continue with next buffer
|
||||
until `next_read==next_write`, then block again or if timeout elapsed, then we
|
||||
reach conditon buffer underflow and `return len < N`.
|
||||
|
||||
. Release the semaphore
|
||||
|
||||
Upon **write** of `N` samples, the writer does something like:
|
||||
|
||||
. Acquire the semapore in the channel's stream object.
|
||||
|
||||
. Write samples to `buff = stream->buffers[next_write]`. If `data_len!=0`,
|
||||
signal `buffer_overflow` (increase field in stream object) and probably
|
||||
increase next_read`.
|
||||
|
||||
. Increase `next_write`.
|
||||
|
||||
. If `next_write` was `== next_read`, signal the reader through the other
|
||||
semaphore that it can continue reading.
|
@@ -71,3 +71,103 @@ with a memory buffer. In this mode, data written to the USRP is actually stored
|
||||
in a buffer, and read commands to the USRP simply pull data from this buffer.
|
||||
This was very useful in early testing, and still may be useful in testing basic
|
||||
Transceiver and radioInterface functionality.
|
||||
|
||||
|
||||
[[backend_ipc]]
|
||||
=== `osmo-trx-ipc` Inter Process Communication backend
|
||||
|
||||
This OsmoTRX model provides its own Inter Process Communication (IPC) interface
|
||||
to drive the radio device driver (from now on the Driver), allowing for third
|
||||
party processes to implement the lowest layer device-specific bits without being
|
||||
affected by copyleft licenses of OsmoTRX.
|
||||
|
||||
For more information on such interface, see section <<ipc_if>>.
|
||||
|
||||
[[fig-backend-ipc]]
|
||||
.Architecture with _osmo-trx-ipc_ and its IPC _Driver_
|
||||
[graphviz]
|
||||
----
|
||||
digraph G {
|
||||
rankdir=LR;
|
||||
MS0 [label="MS"];
|
||||
MS1 [label="MS"];
|
||||
OsmoTRX [label="osmo-trx-ipc", color=red];
|
||||
BTS;
|
||||
|
||||
subgraph cluster_ipc_driver {
|
||||
label = "IPC Driver";
|
||||
color=red;
|
||||
RE [label = "Radio Equipment"];
|
||||
REC [label="Radio Equipment Controller"];
|
||||
RE->REC;
|
||||
}
|
||||
|
||||
REC->OsmoTRX [label="IPC Interface", color=red];
|
||||
|
||||
MS0->RE [label="Um"];
|
||||
MS1->RE [label="Um"];
|
||||
OsmoTRX->BTS [label="bursts over UDP"];
|
||||
|
||||
}
|
||||
----
|
||||
|
||||
A sample config file for this OsmoTRX model can be found in _osmo-trx.git_ https://gitea.osmocom.org/cellular-infrastructure/osmo-trx/src/branch/master/doc/examples/osmo-trx-ipc/osmo-trx-ipc.cfg[doc/examples/osmo-trx-ipc/osmo-trx-ipc.cfg]
|
||||
|
||||
In the config file, the following VTY command can be used to set up the IPC UD Master Socket _osmo-trx-ipc_ will connect to at startup:
|
||||
|
||||
.Example: _osmo-trx-ipc_ will connect to UD Master Socket /tmp/ipc_sock0 upon startup
|
||||
----
|
||||
dev-args ipc_msock=/tmp/ipc_sock0
|
||||
----
|
||||
|
||||
==== ipc-device-test
|
||||
|
||||
When built with `--with-ipc --with-uhd` configure options, _osmo-trx.git_ will
|
||||
build the test program called _ipc-driver-test_. This program implements the
|
||||
_Driver_ side of the osmo-trx-ipc interface (see <<ipc_if>> for more
|
||||
information) on one side, and also interacts internally with UHD (eg B210 as
|
||||
when using osmo-trx-uhd).
|
||||
|
||||
You can use this small program as a reference to:
|
||||
|
||||
* Test and experiment with _osmo-trx-ipc_.
|
||||
|
||||
* Write your own IPC _Driver_ connecting to osmo-trx-ipc.
|
||||
|
||||
[[fig-backend-ipc-device-test]]
|
||||
.Architecture with _osmo-trx-ipc_ and ipc-device-test as IPC _Driver_
|
||||
[graphviz]
|
||||
----
|
||||
digraph G {
|
||||
rankdir=LR;
|
||||
MS0 [label="MS"];
|
||||
MS1 [label="MS"];
|
||||
SDR;
|
||||
ipc_device_test[label = "ipc-device-test", color=red];
|
||||
OsmoTRX [label="osmo-trx-ipc", color=red];
|
||||
BTS;
|
||||
|
||||
MS0->SDR [label="Um"];
|
||||
MS1->SDR [label="Um"];
|
||||
SDR->ipc_device_test [label="UHD"];
|
||||
ipc_device_test->OsmoTRX [label="IPC Interface", color=red];
|
||||
OsmoTRX->BTS [label="bursts over UDP"];
|
||||
}
|
||||
----
|
||||
|
||||
The code for this app is found here:
|
||||
|
||||
* https://gitea.osmocom.org/cellular-infrastructure/osmo-trx/src/branch/master/Transceiver52M/device/ipc/ipc-driver-test.h[Transceiver52M/device/ipc/ipc-driver-test.h]
|
||||
|
||||
* https://gitea.osmocom.org/cellular-infrastructure/osmo-trx/src/branch/master/Transceiver52M/device/ipc/ipc-driver-test.c[Transceiver52M/device/ipc/ipc-driver-test.c]
|
||||
|
||||
Those files use the server-side (_Driver_ side) code to operate the Posix Shared
|
||||
Memory region implemented in files `shm.c`, `shm.h`, `ipc_shm.c` and `ipc_shm.h`
|
||||
in the same directory.
|
||||
|
||||
Most of the code in that same directory is deliverately released under a BSD
|
||||
license (unlike most of _osmo-trx.git_), allowing third parties to reuse/recycle
|
||||
the code on their implemented _Driver_ program no matter it being proprietary or
|
||||
under an open license. However, care must be taken with external dependencies,
|
||||
as for instance shm.c uses the talloc memory allocator, which is GPL licensed
|
||||
and hence cannot be used in a proprietary driver.
|
@@ -35,6 +35,8 @@ include::./common/chapters/vty_cpu_sched.adoc[]
|
||||
|
||||
include::./common/chapters/trx_if.adoc[]
|
||||
|
||||
include::{srcdir}/chapters/ipc_if.adoc[]
|
||||
|
||||
include::./common/chapters/port_numbers.adoc[]
|
||||
|
||||
include::./common/chapters/bibliography.adoc[]
|
||||
|
Submodule osmocom-bb updated: a41ca4bbc4...f12b17dffb
Reference in New Issue
Block a user