45 #include <boost/python.hpp>
46namespace bp = boost::python;
56void rps::SrpV0::setup_python() {
59 bp::class_<rps::SrpV0, rps::SrpV0Ptr, bp::bases<ris::Master, ris::Slave, rim::Slave>, boost::noncopyable>(
66rps::SrpV0::SrpV0() :
ris::Master(),
ris::Slave(),
rim::Slave(4, 2048) {
71rps::SrpV0::~SrpV0() {}
81 header[0] = tran->id();
82 header[1] = (tran->address() >> 2) & 0x3FFFFFFF;
83 header[2] = (tran->size() / 4) - 1;
87 header[1] |= 0x40000000;
88 frameLen = (tran->size() + WrHeadLen + TailLen);
89 headerLen = WrHeadLen;
92 frameLen = RdHeadLen + TailLen;
93 headerLen = RdHeadLen;
95 frameLen = (tran->size() + RxHeadLen + TailLen);
96 headerLen = RxHeadLen;
105 rim::Transaction::iterator tIter;
108 uint32_t header[MaxHeadLen / 4];
109 uint32_t tail[TailLen / 4];
114 if ((tran->address() % min()) != 0) {
115 tran->error(
"Transaction address 0x%" PRIx64
" is not aligned to min size %" PRIu32, tran->address(), min());
120 if ((tran->size() % min()) != 0 || tran->size() < min()) {
121 tran->error(
"Transaction size 0x%" PRIx32
" is not aligned to min size %" PRIu32, tran->size(), min());
125 if (tran->size() > max()) {
126 tran->error(
"Transaction size %" PRIu32
" exceeds max size %" PRIu32, tran->size(), max());
131 doWrite = setupHeader(tran, header, headerLen, frameSize,
true);
134 frame = reqFrame(frameSize,
true);
135 frame->setPayload(frameSize);
140 fIter = frame->begin();
141 tIter = tran->begin();
156 addTransaction(tran);
158 log_->debug(
"Send frame for id=%" PRIu32
", addr 0x%0.8" PRIx64
". Size=%" PRIu32
", type=%" PRIu32
165 log_->debug(
"Send frame for id=%" PRIu32
", header: 0x%0.8" PRIx32
" 0x%0.8" PRIx32
" 0x%0.8" PRIx32,
177 rim::Transaction::iterator tIter;
179 uint32_t header[MaxHeadLen / 4];
180 uint32_t tail[TailLen / 4];
182 uint32_t expHeader[MaxHeadLen / 4];
184 uint32_t expFrameLen;
192 if (frame->getError()) {
193 log_->warning(
"Got errored frame = 0x%" PRIx8, frame->getError());
198 if ((fSize = frame->getPayload()) < 16) {
199 log_->warning(
"Got undersized frame size = %" PRIu32, fSize);
204 fIter = frame->begin();
211 log_->debug(
"Got frame id=%" PRIu32
" header: 0x%0.8" PRIx32
" 0x%0.8" PRIx32
" 0x%0.8" PRIx32,
218 if ((tran = getTransaction(
id)) == NULL) {
219 log_->warning(
"Invalid ID frame for id=%" PRIu32,
id);
227 if (tran->expired()) {
228 log_->warning(
"Transaction expired. Id=%" PRIu32,
id);
231 tIter = tran->begin();
234 doWrite = setupHeader(tran, expHeader, expHeadLen, expFrameLen,
false);
237 if (fSize != expFrameLen) {
238 log_->warning(
"Bad receive length for %" PRIu32
" exp=%" PRIu32
", got=%" PRIu32,
id, expFrameLen, fSize);
243 if (memcmp(header, expHeader, RxHeadLen) != 0) {
244 log_->warning(
"Bad header for %" PRIu32,
id);
249 fIter = frame->end() - TailLen;
252 if (tail[0] & 0x20000)
253 tran->error(
"Axi bus timeout detected in hardware");
254 else if (tail[0] & 0x10000)
255 tran->error(
"Axi bus returned fail status in hardware");
257 tran->error(
"Non zero status message returned on axi bus in hardware: 0x%" PRIu32, tail[0]);
258 log_->warning(
"Error detected for ID id=%" PRIu32
", tail=0x%0.8" PRIu32,
id, tail[0]);
264 fIter = frame->begin() + RxHeadLen;
RAII helper that releases the Python GIL for a scope.
static std::shared_ptr< rogue::Logging > create(const std::string &name, bool quiet=false)
Creates a logger instance.
Random-access byte iterator across a Frame payload.
std::shared_ptr< rogue::interfaces::memory::TransactionLock > TransactionLockPtr
Shared pointer alias for TransactionLock.
static const uint32_t Write
Memory write transaction type.
std::shared_ptr< rogue::interfaces::memory::Transaction > TransactionPtr
Shared pointer alias for Transaction.
static const uint32_t Post
Memory posted write transaction type.
static void fromFrame(rogue::interfaces::stream::FrameIterator &iter, uint32_t size, void *dst)
Copies bytes from a frame iterator to a destination pointer.
std::shared_ptr< rogue::interfaces::stream::Frame > FramePtr
Shared pointer alias for Frame.
static void toFrame(rogue::interfaces::stream::FrameIterator &iter, uint32_t size, void *src)
Copies bytes from a source pointer into a frame iterator.
std::shared_ptr< rogue::interfaces::stream::FrameLock > FrameLockPtr
Shared pointer alias for FrameLock.
std::shared_ptr< rogue::protocols::srp::SrpV0 > SrpV0Ptr