aboutsummaryrefslogtreecommitdiffstats
path: root/mpm/lib/xbar_iface.hpp
blob: 9b17ed97b5c37b3155861e6d61dc7d8ef3f52b52 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
//
// Copyright 2017 Ettus Research (National Instruments)
//
// 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 3 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, see <http://www.gnu.org/licenses/>.
//
#pragma once
#include <boost/noncopyable.hpp>
#include <memory>
#include <mutex>
#include <cstdint>

namespace mpm{

/*!
 * Crossbar route command
 */
using rfnoc_crossbar_cmd =  struct rfnoc_crossbar_cmd {
    /*! destination address */
	uint8_t dest_addr;
    /*! destination port */
	uint8_t dest_port;
};

#define RFNCBWROUTIOC _IOW('R', 1, struct rfnoc_crossbar_cmd)
#define RFNCDELROUTIOC _IOW('D', 1, struct rfnoc_crossbar_cmd)

/*!
 * Crossbar interface class holding a crossbar context
 */
class xbar_iface: boost::noncopyable{
public:
    // use static mutex! lock_guard
    using sptr = std::shared_ptr<xbar_iface>;
    static sptr make(const std::string &device);
    void set_route(uint8_t dst_addr, uint8_t dst_port);
    void del_route(uint8_t dst_addr, uint8_t dst_port);
    ~xbar_iface();
    xbar_iface(const std::string &device);

private:
    static std::mutex _lock;
    int _fd;
};
}


#ifdef LIBMPM_PYTHON
void export_xbar(){
    LIBMPM_BOOST_PREAMBLE("xbar")
    bp::class_<mpm::xbar_iface, boost::noncopyable, std::shared_ptr<mpm::xbar_iface> >("xbar", bp::no_init)
        .def("make", &mpm::xbar_iface::make)
        .staticmethod("make")
        .def("set_route", &mpm::xbar_iface::set_route)
        .def("del_route", &mpm::xbar_iface::del_route)
    ;
}
#endif