pcipywrap.c 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. #include "pcilib.h"
  2. //Remove unused headers
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. #include <strings.h>
  7. #include <stdint.h>
  8. #include <stdarg.h>
  9. #include <fcntl.h>
  10. #include <unistd.h>
  11. #include <sys/time.h>
  12. #include <sys/ioctl.h>
  13. #include <sys/mman.h>
  14. #include <errno.h>
  15. #include <alloca.h>
  16. #include <arpa/inet.h>
  17. #include <sys/types.h>
  18. #include <sys/stat.h>
  19. #include <dirent.h>
  20. #include <pthread.h>
  21. #include <signal.h>
  22. #include <dlfcn.h>
  23. #include <getopt.h>
  24. #include <fastwriter.h>
  25. #include "pcitool/sysinfo.h"
  26. #include "pcitool/formaters.h"
  27. #include "views/transform.h"
  28. #include "views/enum.h"
  29. #include "pci.h"
  30. #include "plugin.h"
  31. #include "config.h"
  32. #include "tools.h"
  33. #include "kmem.h"
  34. #include "error.h"
  35. #include "debug.h"
  36. #include "model.h"
  37. #include "locking.h"
  38. pcilib_t* __ctx = 0;
  39. pcilib_model_description_t *model_info = 0;
  40. /*!
  41. * \brief присваивание указателя на устройство. Закрытая функция. Будет проходить при парсинге xml.
  42. * \param ctx
  43. */
  44. void __initCtx(void* ctx)
  45. {
  46. __ctx = ctx;
  47. }
  48. /*!
  49. * \brief создание хэндлера устройства, для тестирования скрипта не из программы.
  50. * \return
  51. */
  52. void __createCtxInstance(const char *fpga_device, const char *model)
  53. {
  54. __ctx = pcilib_open(fpga_device, model);
  55. model_info = pcilib_get_model_description(__ctx);
  56. }
  57. int read_register(const char *bank, const char *regname, void *value)
  58. {
  59. int ret = pcilib_read_register(__ctx, bank, regname, (pcilib_register_value_t*)value);
  60. return ret;
  61. }
  62. void Error(const char *message, const char *attr, ...)
  63. {
  64. printf("Catch error: %s, %s\n", message, attr);
  65. }
  66. int ReadRegister(const char *bank, const char *reg) {
  67. const char *view = NULL;
  68. const char *unit = NULL;
  69. const char *attr = NULL;
  70. pcilib_t *handle = __ctx;
  71. int i;
  72. int err;
  73. const char *format;
  74. pcilib_register_bank_t bank_id;
  75. pcilib_register_bank_addr_t bank_addr = 0;
  76. pcilib_register_value_t value;
  77. // Adding DMA registers
  78. pcilib_get_dma_description(handle);
  79. if (reg||view||attr) {
  80. pcilib_value_t val = {0};
  81. if (attr) {
  82. if (reg) err = pcilib_get_register_attr(handle, bank, reg, attr, &val);
  83. else if (view) err = pcilib_get_property_attr(handle, view, attr, &val);
  84. else if (bank) err = pcilib_get_register_bank_attr(handle, bank, attr, &val);
  85. else err = PCILIB_ERROR_INVALID_ARGUMENT;
  86. if (err) {
  87. if (err == PCILIB_ERROR_NOTFOUND)
  88. Error("Attribute %s is not found", attr);
  89. else
  90. Error("Error (%i) reading attribute %s", err, attr);
  91. }
  92. err = pcilib_convert_value_type(handle, &val, PCILIB_TYPE_STRING);
  93. if (err) Error("Error converting attribute %s to string", attr);
  94. printf("%s = %s", attr, val.sval);
  95. if ((val.unit)&&(strcasecmp(val.unit, "name")))
  96. printf(" %s", val.unit);
  97. printf(" (for %s)\n", (reg?reg:(view?view:bank)));
  98. } else if (view) {
  99. if (reg) {
  100. err = pcilib_read_register_view(handle, bank, reg, view, &val);
  101. if (err) Error("Error reading view %s of register %s", view, reg);
  102. } else {
  103. err = pcilib_get_property(handle, view, &val);
  104. if (err) Error("Error reading property %s", view);
  105. }
  106. if (unit) {
  107. err = pcilib_convert_value_unit(handle, &val, unit);
  108. if (err) {
  109. if (reg) Error("Error converting view %s of register %s to unit %s", view, reg, unit);
  110. else Error("Error converting property %s to unit %s", view, unit);
  111. }
  112. }
  113. err = pcilib_convert_value_type(handle, &val, PCILIB_TYPE_STRING);
  114. if (err) {
  115. if (reg) Error("Error converting view %s of register %s to string", view);
  116. else Error("Error converting property %s to string", view);
  117. }
  118. printf("%s = %s", (reg?reg:view), val.sval);
  119. if ((val.unit)&&(strcasecmp(val.unit, "name")))
  120. printf(" %s", val.unit);
  121. printf("\n");
  122. } else {
  123. pcilib_register_t regid = pcilib_find_register(handle, bank, reg);
  124. bank_id = pcilib_find_register_bank_by_addr(handle, model_info->registers[regid].bank);
  125. format = model_info->banks[bank_id].format;
  126. if (!format) format = "%lu";
  127. err = pcilib_read_register_by_id(handle, regid, &value);
  128. if (err) Error("Error reading register %s", reg);
  129. printf("%s = ", reg);
  130. printf(format, value);
  131. printf("\n");
  132. }
  133. } else {
  134. if (model_info->registers) {
  135. if (bank) {
  136. bank_id = pcilib_find_register_bank(handle, bank);
  137. bank_addr = model_info->banks[bank_id].addr;
  138. }
  139. printf("Registers:\n");
  140. for (i = 0; model_info->registers[i].bits; i++) {
  141. 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)) {
  142. bank_id = pcilib_find_register_bank_by_addr(handle, model_info->registers[i].bank);
  143. format = model_info->banks[bank_id].format;
  144. if (!format) format = "%lu";
  145. err = pcilib_read_register_by_id(handle, i, &value);
  146. if (err) printf(" %s = error reading value", model_info->registers[i].name);
  147. else {
  148. printf(" %s = ", model_info->registers[i].name);
  149. printf(format, value);
  150. }
  151. printf(" [");
  152. printf(format, model_info->registers[i].defvalue);
  153. printf("]");
  154. printf("\n");
  155. }
  156. }
  157. } else {
  158. printf("No registers");
  159. }
  160. printf("\n");
  161. }
  162. return 0;
  163. }