3
//Remove unused headers
13
#include <sys/ioctl.h>
17
#include <arpa/inet.h>
18
#include <sys/types.h>
27
#include <fastwriter.h>
29
#include "pcitool/sysinfo.h"
30
#include "pcitool/formaters.h"
32
#include "views/transform.h"
33
#include "views/enum.h"
7
* \brief Global pointer to pcilib_t context.
8
* Used by __setPcilib and read_register.
44
10
pcilib_t* __ctx = 0;
45
pcilib_model_description_t *model_info = 0;
48
* \brief присваивание указателя на устройство. Закрытая функция. Будет проходить при парсинге xml.
51
void __initCtx(void* ctx)
57
* \brief создание хэндлера устройства, для тестирования скрипта не из программы.
60
void __createCtxInstance(const char *fpga_device, const char *model)
62
__ctx = pcilib_open(fpga_device, model);
63
model_info = pcilib_get_model_description(__ctx);
66
int read_register(const char *bank, const char *regname, void *value)
68
int ret = pcilib_read_register(__ctx, bank, regname, (pcilib_register_value_t*)value);
72
void Error(const char *message, const char *attr, ...)
74
printf("Catch error: %s, %s\n", message, attr);
77
int ReadRegister(const char *bank, const char *reg) {
79
const char *view = NULL;
80
const char *unit = NULL;
81
const char *attr = NULL;
82
pcilib_t *handle = __ctx;
87
pcilib_register_bank_t bank_id;
88
pcilib_register_bank_addr_t bank_addr = 0;
90
pcilib_register_value_t value;
92
// Adding DMA registers
93
pcilib_get_dma_description(handle);
95
if (reg||view||attr) {
96
pcilib_value_t val = {0};
98
if (reg) err = pcilib_get_register_attr(handle, bank, reg, attr, &val);
99
else if (view) err = pcilib_get_property_attr(handle, view, attr, &val);
100
else if (bank) err = pcilib_get_register_bank_attr(handle, bank, attr, &val);
101
else err = PCILIB_ERROR_INVALID_ARGUMENT;
104
if (err == PCILIB_ERROR_NOTFOUND)
105
Error("Attribute %s is not found", attr);
107
Error("Error (%i) reading attribute %s", err, attr);
110
err = pcilib_convert_value_type(handle, &val, PCILIB_TYPE_STRING);
111
if (err) Error("Error converting attribute %s to string", attr);
113
printf("%s = %s", attr, val.sval);
114
if ((val.unit)&&(strcasecmp(val.unit, "name")))
115
printf(" %s", val.unit);
116
printf(" (for %s)\n", (reg?reg:(view?view:bank)));
119
err = pcilib_read_register_view(handle, bank, reg, view, &val);
120
if (err) Error("Error reading view %s of register %s", view, reg);
122
err = pcilib_get_property(handle, view, &val);
123
if (err) Error("Error reading property %s", view);
127
err = pcilib_convert_value_unit(handle, &val, unit);
129
if (reg) Error("Error converting view %s of register %s to unit %s", view, reg, unit);
130
else Error("Error converting property %s to unit %s", view, unit);
134
err = pcilib_convert_value_type(handle, &val, PCILIB_TYPE_STRING);
136
if (reg) Error("Error converting view %s of register %s to string", view);
137
else Error("Error converting property %s to string", view);
140
printf("%s = %s", (reg?reg:view), val.sval);
141
if ((val.unit)&&(strcasecmp(val.unit, "name")))
142
printf(" %s", val.unit);
145
pcilib_register_t regid = pcilib_find_register(handle, bank, reg);
146
bank_id = pcilib_find_register_bank_by_addr(handle, model_info->registers[regid].bank);
147
format = model_info->banks[bank_id].format;
148
if (!format) format = "%lu";
149
err = pcilib_read_register_by_id(handle, regid, &value);
150
if (err) Error("Error reading register %s", reg);
152
printf("%s = ", reg);
153
printf(format, value);
157
if (model_info->registers) {
159
bank_id = pcilib_find_register_bank(handle, bank);
160
bank_addr = model_info->banks[bank_id].addr;
163
printf("Registers:\n");
164
for (i = 0; model_info->registers[i].bits; i++) {
165
if ((model_info->registers[i].mode & PCILIB_REGISTER_R)&&((!bank)||(model_info->registers[i].bank == bank_addr))&&(model_info->registers[i].type != PCILIB_REGISTER_BITS)) {
166
bank_id = pcilib_find_register_bank_by_addr(handle, model_info->registers[i].bank);
167
format = model_info->banks[bank_id].format;
168
if (!format) format = "%lu";
170
err = pcilib_read_register_by_id(handle, i, &value);
171
if (err) printf(" %s = error reading value", model_info->registers[i].name);
173
printf(" %s = ", model_info->registers[i].name);
174
printf(format, value);
178
printf(format, model_info->registers[i].defvalue);
184
printf("No registers");
13
* \brief Wraps for pcilib_open function.
14
* \param[in] fpga_device path to the device file [/dev/fpga0]
15
* \param[in] model specifies the model of hardware, autodetected if NULL is passed
16
* \return Pointer to pcilib_t, created by pcilib_open, serialized to bytearray
18
PyObject* __createPcilibInstance(const char *fpga_device, const char *model)
21
pcilib_t* ctx = pcilib_open(fpga_device, model);
24
return PyByteArray_FromStringAndSize((const char*)&ctx, sizeof(pcilib_t*));
28
* \brief Sets pcilib context to wraper.
29
* \param[in] addr Pointer to pcilib_t, serialized to bytearray
31
void __setPcilib(PyObject* addr)
33
if(!PyByteArray_Check(addr))
35
PyErr_SetString(PyExc_Exception, "Incorrect addr type. Only bytearray is allowed");
39
//deserializing adress
40
char* pAddr = PyByteArray_AsString(addr);
42
//hard copy context adress
43
for(int i = 0; i < sizeof(pcilib_t*) + 10; i++)
44
((char*)&__ctx)[i] = pAddr[i];
50
* \brief Reads register value.
51
* \param[in] regname the name of the register
52
* \param[in] bank should specify the bank name if register with the same name may occur in multiple banks, NULL otherwise
53
* \return register value, can be integer or float type
55
PyObject* read_register(const char *regname, const char *bank)
59
PyErr_SetString(PyExc_Exception, "pcilib_t handler not initialized");
63
pcilib_get_dma_description(__ctx);
65
pcilib_value_t val = {0};
66
pcilib_register_value_t reg_value;
70
err = pcilib_read_register(__ctx, bank, regname, ®_value);
73
PyErr_SetString(PyExc_Exception, "Failed: read_register");
77
err = pcilib_set_value_from_register_value(__ctx, &val, reg_value);
81
PyErr_SetString(PyExc_Exception, "Failed: pcilib_set_value_from_register_value");
87
case PCILIB_TYPE_INVALID:
88
PyErr_SetString(PyExc_Exception, "Invalid register output type (PCILIB_TYPE_INVALID)");
91
case PCILIB_TYPE_STRING:
92
PyErr_SetString(PyExc_Exception, "Invalid register output type (PCILIB_TYPE_STRING)");
95
case PCILIB_TYPE_LONG:
98
ret = pcilib_get_value_as_int(__ctx, &val, &err);
102
PyErr_SetString(PyExc_Exception, "Failed: pcilib_get_value_as_int");
105
return PyInt_FromLong((long) ret);
108
case PCILIB_TYPE_DOUBLE:
111
ret = pcilib_get_value_as_float(__ctx, &val, &err);
115
PyErr_SetString(PyExc_Exception, "Failed: pcilib_get_value_as_int");
118
return PyFloat_FromDouble((double) ret);
122
PyErr_SetString(PyExc_Exception, "Invalid register output type (unknown)");