GithubHelp home page GithubHelp logo

pothosware / soapymultisdr Goto Github PK

View Code? Open in Web Editor NEW
13.0 25.0 3.0 25 KB

Multi-device support module for SoapySDR

Home Page: https://github.com/pothosware/SoapyMultiSDR/wiki

License: Boost Software License 1.0

CMake 1.28% C++ 98.72%
multisdr mimo sdr soapysdr gnuradio pothos

soapymultisdr's Introduction

soapymultisdr's People

Contributors

guruofquality avatar ncorgan avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

soapymultisdr's Issues

Argument naming convention

Multi prefix to make it through the inception

Since SoapyMultiSDR is a bit of a meta-wrapper, I was thinking about how the arguments to specify devices could be formatted to make it through the system. For example, the remote module uses remote: prefix to denote args that should only go to the remote system.

  • For example remote uses: driver=remote,remote:driver=rtlsdr
  • Then multi could use: driver=multi,multi:driver=rtlsdr

This is especially useful for the driver keyword which is used inside the factory lookup itself to filter out support modules. But we can support it in general for other args. The MultiSDR will simply strip the prefix whenever its found.

Index format for specific device indexes

That would specify the "multi" support module and the rtlsdr driver for all internal devices. Now thats not going to be enough for the multi module as it needs specifying arguments for each device. I was imagining a different "indexing-format" for specifying a specific device in the list of devices:

  • driver=multi,multi:driver=rtlsdr,serial[0]=00000001,serial[1]=00000002

Now the multi driver can see there are two devices because it has two indexed keywords, and it can format the internal device args to find and make each internal device:

  • Device 0 args: driver=rtlsdr,serial=00000001
  • Device 1 args: driver=rtlsdr,serial=00000002

One could also imagine skipping the multi prefix and using the index format here. Perhaps redundant this way if you are using homogeneous devices:

  • driver=multi,driver[0]=rtlsdr,driver[1]=rtlsdr,serial[0]=00000001,serial[1]=00000002

Regular global named stuff

Lets use the same index format for named items (example global sensors). Because these don't have a specific channel space which can be segmented for the multi-device, we must modify the names. So if each rtl had a sensor named foo, then the names presented as the multi device would be foo[0] and foo[1].

Inception with SoapyRemote

Although it hurts to think about, we are going to want to make sure the system is complete by supporting a SoapyMultiSDR made up on individual SoapyRemotes or a SoapyRemote that proxies for a local SoapyMultiSDR. Note that many of the arguments don't get prefixed because they don't really need to be mutated between layers since they are ignored in these layers:

Args for MultiSDR of remotes

driver=multi,multi:driver=remote,remote=host,remote:driver=rtlsdr,serial[0]=00000001,serial[1]=00000002

  • driver=multi specifies the multi support module
  • multi:driver=remote uses the remote support module for each internal device
  • remote=host specifies the remote host (could use index format if different hosts)
  • remote:driver=rtlsdr specifies the rtl driver on the remote node
  • serial[0]=00000001 specifies the specific device serial number

Args for SoapyRemote to proxy a MultiSDR

driver=remote,remote:driver=multi,remote=host,multi:driver=rtlsdr,serial[0]=00000001,serial[1]=00000002

  • driver=remote specifies the remote support module
  • remote:driver=multi specifies the multi driver on the remote end
  • remote=host specifies the remote host (could use index format if different hosts)
  • multi:driver=rtlsdr specifies the rtl driver on the remote node in the multi module
  • serial[0]=00000001 specifies the specific device serial number

APIs that didnt port well to multi-ness

  • channel api -
    • frontend mapping - made the format a comma separated list. Not so bad, and this probably works for anyone using it - probably ok
  • clock api -
    • clock rate api - sets the same rate to all devices -- probably ok
    • clock source api - no way to set source differently on different devices. A possible workaround might be to use comma separation like the frontend mapping.
  • time api -
    • time source api - no way to set source differently on different devices. A possible workaround might be to use comma separation like the frontend mapping.
  • register api -
    • read/write register does not specify a device -- this call is deprecated and has been replaced by a named version which will support multiple devices -- probably ok
  • i2c and spi api - does not specify a specific bank, this api does not support multiple banks, let alone multiple devices. Probably needs named banks just like uarts, gpio, and the new register api

polishing it up tasks

  • debian/ package directory
  • add to PothosSDR build script
  • add to homebrew recipes
  • basic wiki page that documents arg usage
  • add link to the supported devices list

Set driver roles as dedicated RX and TX

I'm trying to set bladeRF as RX and HackRF as TX or visa versa for srsRAN. If I use this argument in my enb.conf file, Soapy loads the BladeRF as both RX and TX and ignores the HackRF completely.

device_name = soapy
device_args = driver=multi, driver[0]=bladerf,driver[1]=hackrf

If I set it the other way, it seems to set the HackRF as both RX and TX which doesn't work because it's half duplex.

device_name = soapy
device_args = driver=multi, driver[0]=hackrf,driver[1]=bladerf

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.