From 3113053916137c62c832379dd9d889b87ddc1906 Mon Sep 17 00:00:00 2001 From: h-4nd-h Date: Sun, 27 Sep 2020 16:50:20 +0330 Subject: [PATCH] Regs --- BaseRegister.cpp | 49 +++++++++++++++++++++++ BaseRegister.h | 36 +++++++++++++++++ BaseRegisterRegion.cpp | 6 +++ BaseRegisterRegion.h | 19 +++++++++ HarwareTest.pro | 14 +++++-- RegisterField.cpp | 79 ++++++++++++++++++++++++++++++++++++++ RegisterField.h | 27 +++++++++++++ Registers/TestRegister.cpp | 14 +++++++ Registers/TestRegister.h | 16 ++++++++ main.cpp | 34 +++++++++------- 10 files changed, 278 insertions(+), 16 deletions(-) create mode 100644 BaseRegister.cpp create mode 100644 BaseRegister.h create mode 100644 BaseRegisterRegion.cpp create mode 100644 BaseRegisterRegion.h create mode 100644 RegisterField.cpp create mode 100644 RegisterField.h create mode 100644 Registers/TestRegister.cpp create mode 100644 Registers/TestRegister.h diff --git a/BaseRegister.cpp b/BaseRegister.cpp new file mode 100644 index 0000000..baad930 --- /dev/null +++ b/BaseRegister.cpp @@ -0,0 +1,49 @@ +#include "BaseRegister.h" + +BaseRegister::BaseRegister(quint32 bar, quint32 offset, const UltraSoundDevice& usd) +{ + this->_bar = bar; + this->_offset = offset; + this->_usd = usd; + _isSync = false; +} + +/*************************************************************************************************/ +quint32 BaseRegister::read() +{ + auto readValue = _usd.readWord(_offset, _bar); + _isSync = true; + + for(auto i = 0; i < _fields.length(); i++) + { + _fields[i].ExtractValue(readValue); + } + + return readValue; +} + +/*************************************************************************************************/ +void BaseRegister::write() +{ + _usd.writeWord(_offset, _bar, _value); + _isSync = false; +} + +/*************************************************************************************************/ +void BaseRegister::appendToList(const RegisterField& registerField) +{ + connect(®isterField, &RegisterField::fieldUpdated, this, &BaseRegister::fieldUpdated); + _fields.append(registerField); +} + +/*************************************************************************************************/ +void BaseRegister::fieldUpdated(quint32 value, quint32 clearMask) +{ + if(!_isSync) + { + read(); + } + + auto temp = _readValue & clearMask; + temp |= value; +} diff --git a/BaseRegister.h b/BaseRegister.h new file mode 100644 index 0000000..4df4270 --- /dev/null +++ b/BaseRegister.h @@ -0,0 +1,36 @@ +#ifndef BASEREGISTER_H +#define BASEREGISTER_H + +#include + +#include "api.h" +#include "RegisterField.h" + +class BaseRegister : public QObject +{ + Q_OBJECT + +protected: + quint32 _bar; + quint32 _offset; + quint32 _value; + quint32 _readValue; + bool _isSync; + UltraSoundDevice _usd; + QList _fields; + + void appendToList(const RegisterField& registerField); + +public: + explicit BaseRegister(quint32 _bar, quint32 _offset, const UltraSoundDevice& _usd); + + quint32 read(); + void write(); + +//uncrustify off +public slots: + void fieldUpdated(quint32 _value, quint32 clearMask); +//uncrustify on +}; + +#endif //BASEREGISTER_H diff --git a/BaseRegisterRegion.cpp b/BaseRegisterRegion.cpp new file mode 100644 index 0000000..8a1c807 --- /dev/null +++ b/BaseRegisterRegion.cpp @@ -0,0 +1,6 @@ +#include "BaseRegisterRegion.h" + +BaseRegisterRegion::BaseRegisterRegion() +{ + +} diff --git a/BaseRegisterRegion.h b/BaseRegisterRegion.h new file mode 100644 index 0000000..715091c --- /dev/null +++ b/BaseRegisterRegion.h @@ -0,0 +1,19 @@ +#ifndef BASEREGISTERREGION_H +#define BASEREGISTERREGION_H + +#include "BaseRegister.h" + +class BaseRegisterRegion +{ +private: + QList _registers; + +public: + BaseRegisterRegion(); + + void writeAll(); + void readAll(); + void clearAll(); +}; + +#endif //BASEREGISTERREGION_H diff --git a/HarwareTest.pro b/HarwareTest.pro index 7cbc43b..cada495 100644 --- a/HarwareTest.pro +++ b/HarwareTest.pro @@ -16,21 +16,29 @@ DEFINES += QT_DEPRECATED_WARNINGS #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 SOURCES += \ + BaseRegister.cpp \ + BaseRegisterRegion.cpp \ + RegisterField.cpp \ + Registers/TestRegister.cpp \ main.cpp \ mainwindow.cpp \ - /home/hasis/Desktop/pcie/pcie_driver/api/api.cpp \ + /home/hasis/Desktop/pcie/USPCIeDriver/driver/api/api.cpp \ waitdialog.cpp HEADERS += \ + BaseRegister.h \ + BaseRegisterRegion.h \ + RegisterField.h \ + Registers/TestRegister.h \ mainwindow.h \ - /home/hasis/Desktop/pcie/pcie_driver/api/api.h \ + /home/hasis/Desktop/pcie/USPCIeDriver/driver/api/api.h \ waitdialog.h FORMS += \ mainwindow.ui \ waitdialog.ui -INCLUDEPATH += /home/hasis/Desktop/pcie/pcie_driver/api/ +INCLUDEPATH += /home/hasis/Desktop/pcie/USPCIeDriver/driver/api/ # Default rules for deployment. qnx: target.path = /tmp/$${TARGET}/bin diff --git a/RegisterField.cpp b/RegisterField.cpp new file mode 100644 index 0000000..e1f5092 --- /dev/null +++ b/RegisterField.cpp @@ -0,0 +1,79 @@ +#include "RegisterField.h" + +/*************************************************************************************************/ +quint32 RegisterField::getBitPosition() +{ + auto bitPosition = 0U; + auto mask = _mask; + while(true) + { + if((mask & 0x01) == 0x01) + { + break; + } + + bitPosition++; + mask = mask >> 1; + } + + return bitPosition; +} + +/*************************************************************************************************/ +quint32 RegisterField::getBitLength() +{ + auto bitlength = 0U; + auto mask = _mask >> getBitPosition(); + while(true) + { + if((mask & 0x01) != 0x01) + { + break; + } + + bitlength++; + mask = mask >> 1; + } + + return bitlength; +} + +/*************************************************************************************************/ +RegisterField::RegisterField(quint32 mask, bool isSigned) +{ + _mask = mask; + _isSigned = isSigned; +} + +/*************************************************************************************************/ +void RegisterField::update(quint32 value) +{ + if(_value == value) + { + return; + } + _value = value; + + quint32 temp = 0; + temp = (_value << getBitPosition()) & _mask; + + emit fieldUpdated(_value, ~_mask); +} + +/*************************************************************************************************/ +quint32 RegisterField::getRawValue() +{ + return _value; +} + +/*************************************************************************************************/ +void RegisterField::ExtractValue(quint32 value) +{ + auto temp = (value >> getBitPosition()) & (_mask >> getBitPosition()); + if(_isSigned && ((temp >> (getBitLength() - 1)) & 0x01) == 0x01) + { + temp |= (~(_mask >> getBitPosition())); + } + + _value = temp; +} diff --git a/RegisterField.h b/RegisterField.h new file mode 100644 index 0000000..2efcdfb --- /dev/null +++ b/RegisterField.h @@ -0,0 +1,27 @@ +#ifndef REGISTERFIELD_H +#define REGISTERFIELD_H + +#include + +class RegisterField : public QObject +{ + Q_OBJECT + +private: + quint32 _mask; + quint32 _value; + bool _isSigned; + quint32 getBitPosition(); + quint32 getBitLength(); + +public: + RegisterField(quint32 mask, bool isSigned); + void update(quint32 value); + quint32 getRawValue(); + void ExtractValue(quint32 value); + +signals: + void fieldUpdated(quint32 value, quint32 clearMask); +}; + +#endif //REGISTERFIELD_H diff --git a/Registers/TestRegister.cpp b/Registers/TestRegister.cpp new file mode 100644 index 0000000..6dccb38 --- /dev/null +++ b/Registers/TestRegister.cpp @@ -0,0 +1,14 @@ +#include "TestRegister.h" + +TestRegister::TestRegister(quint32 offset, quint32 bar, const UltraSoundDevice& usd) : BaseRegister( + offset, + bar, + usd), + fiedl1(0x000000FF, false), + fiedl2(0x0000FF00, false), + fiedl3(0xFFFF0000, false) +{ + appendToList(fiedl1); + appendToList(fiedl2); + appendToList(fiedl3); +} diff --git a/Registers/TestRegister.h b/Registers/TestRegister.h new file mode 100644 index 0000000..92f8ce5 --- /dev/null +++ b/Registers/TestRegister.h @@ -0,0 +1,16 @@ +#ifndef TESTREGISTER_H +#define TESTREGISTER_H + +#include "BaseRegister.h" + +class TestRegister : public BaseRegister +{ +public: + TestRegister(quint32 _offset, quint32 _bar, const UltraSoundDevice& _usd); + + RegisterField fiedl1; + RegisterField fiedl2; + RegisterField fiedl3; +}; + +#endif //TESTREGISTER_H diff --git a/main.cpp b/main.cpp index c2b691f..a813f93 100644 --- a/main.cpp +++ b/main.cpp @@ -4,18 +4,26 @@ #include #include -int main(int argc, char *argv[]) +#include "Registers/TestRegister.h" + +int main(int argc, char* argv[]) { - QApplication a(argc, argv); - MainWindow w; - w.setGeometry( - QStyle::alignedRect( - Qt::LeftToRight, - Qt::AlignCenter, - w.size(), - qApp->desktop()->availableGeometry() - ) - ); - w.show(); - return a.exec(); + QApplication a(argc, argv); + MainWindow w; + w.setGeometry( + QStyle::alignedRect( + Qt::LeftToRight, + Qt::AlignCenter, + w.size(), + qApp->desktop()->availableGeometry() + ) + ); + + UltraSoundDevice usd; + TestRegister t(0, 0, usd); + t.fiedl1.update(2); + + w.show(); + + return a.exec(); }