pcilib.h 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254
  1. #ifndef _PCITOOL_PCILIB_H
  2. #define _PCITOOL_PCILIB_H
  3. #define PCILIB_MAX_BANKS 6
  4. #define PCILIB_MAX_DMA_ENGINES 32
  5. #include <time.h>
  6. #include <stdint.h>
  7. #ifndef __timespec_defined
  8. struct timespec {
  9. time_t tv_sec;
  10. long tv_nsec;
  11. };
  12. #endif /* __timespec_defined */
  13. #define pcilib_memcpy pcilib_memcpy32
  14. #define pcilib_datacpy pcilib_datacpy32
  15. typedef struct pcilib_s pcilib_t;
  16. typedef void pcilib_context_t;
  17. typedef void pcilib_dma_context_t;
  18. typedef struct pcilib_dma_api_description_s pcilib_dma_api_description_t;
  19. typedef struct pcilib_event_api_description_s pcilib_event_api_description_t;
  20. typedef struct pcilib_protocol_description_s pcilib_protocol_description_t;
  21. typedef unsigned long pcilib_irq_source_t;
  22. typedef uint8_t pcilib_bar_t; /**< Type holding the PCI Bar number */
  23. typedef uint8_t pcilib_register_t; /**< Type holding the register ID within the Bank */
  24. typedef uint32_t pcilib_register_addr_t; /**< Type holding the register ID within the Bank */
  25. typedef uint8_t pcilib_register_bank_t; /**< Type holding the register bank number */
  26. typedef uint8_t pcilib_register_bank_addr_t; /**< Type holding the register bank number */
  27. typedef uint8_t pcilib_register_size_t; /**< Type holding the size in bits of the register */
  28. typedef uint32_t pcilib_register_value_t; /**< Type holding the register value */
  29. typedef uint8_t pcilib_dma_engine_addr_t;
  30. typedef uint8_t pcilib_dma_engine_t;
  31. typedef uint64_t pcilib_event_id_t;
  32. typedef uint32_t pcilib_event_t;
  33. typedef enum {
  34. PCILIB_HOST_ENDIAN = 0,
  35. PCILIB_LITTLE_ENDIAN,
  36. PCILIB_BIG_ENDIAN
  37. } pcilib_endianess_t;
  38. typedef enum {
  39. PCILIB_MODEL_DETECT,
  40. PCILIB_MODEL_PCI,
  41. PCILIB_MODEL_IPECAMERA
  42. } pcilib_model_t;
  43. typedef enum {
  44. PCILIB_REGISTER_R = 1,
  45. PCILIB_REGISTER_W = 2,
  46. PCILIB_REGISTER_RW = 3,
  47. PCILIB_REGISTER_W1C = 4, /**< writting 1 resets the flag */
  48. PCILIB_REGISTER_RW1C = 5
  49. } pcilib_register_mode_t;
  50. typedef enum {
  51. PCILIB_DEFAULT_PROTOCOL,
  52. IPECAMERA_REGISTER_PROTOCOL
  53. } pcilib_register_protocol_t;
  54. typedef enum {
  55. PCILIB_EVENT_DATA
  56. } pcilib_event_data_type_t;
  57. typedef enum {
  58. PCILIB_DMA_FLAGS_DEFAULT = 0,
  59. PCILIB_DMA_FLAG_EOP = 1
  60. } pcilib_dma_flags_t;
  61. typedef enum {
  62. PCILIB_REGISTER_STANDARD = 0,
  63. PCILIB_REGISTER_FIFO,
  64. PCILIB_REGISTER_BITS
  65. } pcilib_register_type_t;
  66. #define PCILIB_BAR_DETECT ((pcilib_bar_t)-1)
  67. #define PCILIB_BAR_INVALID ((pcilib_bar_t)-1)
  68. #define PCILIB_BAR0 0
  69. #define PCILIB_BAR1 1
  70. #define PCILIB_DMA_INVALID ((pcilib_dma_engine_t)-1)
  71. #define PCILIB_REGISTER_INVALID ((pcilib_register_t)-1)
  72. #define PCILIB_ADDRESS_INVALID ((uintptr_t)-1)
  73. #define PCILIB_REGISTER_BANK_INVALID ((pcilib_register_bank_t)-1)
  74. #define PCILIB_REGISTER_BANK0 0
  75. #define PCILIB_REGISTER_BANK1 1
  76. #define PCILIB_REGISTER_BANK2 2
  77. #define PCILIB_REGISTER_BANK3 3
  78. #define PCILIB_REGISTER_BANK_DMA 128
  79. #define PCILIB_EVENT0 1
  80. #define PCILIB_EVENT1 2
  81. #define PCILIB_EVENT2 4
  82. #define PCILIB_EVENT3 8
  83. #define PCILIB_EVENTS_ALL ((pcilib_event_t)-1)
  84. #define PCILIB_EVENT_INVALID ((pcilib_event_t)-1)
  85. #define PCILIB_EVENT_ID_INVALID 0
  86. #define PCILIB_TIMEOUT_INFINITE ((size_t)-1)
  87. #define PCILIB_TIMEOUT_IMMEDIATE 0
  88. typedef int (*pcilib_dma_callback_t)(void *ctx, pcilib_dma_flags_t flags, size_t bufsize, void *buf);
  89. typedef int (*pcilib_event_callback_t)(pcilib_event_t event, pcilib_event_id_t event_id, void *user);
  90. typedef struct {
  91. pcilib_register_bank_addr_t addr;
  92. pcilib_bar_t bar; // optional
  93. size_t size;
  94. pcilib_register_protocol_t protocol;
  95. uintptr_t read_addr; // or offset if bar specified
  96. uintptr_t write_addr; // or offset if bar specified
  97. uint8_t raw_endianess;
  98. uint8_t access;
  99. uint8_t endianess;
  100. const char *format;
  101. const char *name;
  102. const char *description;
  103. } pcilib_register_bank_description_t;
  104. typedef struct {
  105. pcilib_register_addr_t addr;
  106. pcilib_register_size_t offset;
  107. pcilib_register_size_t bits;
  108. pcilib_register_value_t defvalue;
  109. pcilib_register_value_t rwmask; /**< 1 - read before write bits, 0 - zero should be written to preserve value */
  110. pcilib_register_mode_t mode;
  111. pcilib_register_type_t type;
  112. pcilib_register_bank_t bank;
  113. const char *name;
  114. const char *description;
  115. } pcilib_register_description_t;
  116. /**
  117. * Default mappings
  118. */
  119. typedef struct {
  120. uintptr_t start;
  121. uintptr_t end;
  122. pcilib_register_bank_t bank;
  123. } pcilib_register_range_t;
  124. typedef struct {
  125. const char *name;
  126. const char *description;
  127. } pcilib_event_description_t;
  128. typedef enum {
  129. PCILIB_DMA_FROM_DEVICE = 1,
  130. PCILIB_DMA_TO_DEVICE = 2,
  131. PCILIB_DMA_BIDIRECTIONAL = 3
  132. } pcilib_dma_direction_t;
  133. typedef enum {
  134. PCILIB_DMA_TYPE_BLOCK,
  135. PCILIB_DMA_TYPE_PACKET,
  136. PCILIB_DMA_TYPE_UNKNOWN
  137. } pcilib_dma_engine_type_t;
  138. typedef struct {
  139. pcilib_dma_engine_addr_t addr;
  140. pcilib_dma_engine_type_t type;
  141. pcilib_dma_direction_t direction;
  142. size_t addr_bits;
  143. } pcilib_dma_engine_description_t;
  144. typedef struct {
  145. pcilib_dma_engine_description_t *engines[PCILIB_MAX_DMA_ENGINES + 1];
  146. } pcilib_dma_info_t;
  147. typedef struct {
  148. uint8_t access;
  149. uint8_t endianess;
  150. pcilib_register_description_t *registers;
  151. pcilib_register_bank_description_t *banks;
  152. pcilib_register_range_t *ranges;
  153. pcilib_event_description_t *events;
  154. pcilib_dma_api_description_t *dma_api;
  155. pcilib_event_api_description_t *event_api;
  156. } pcilib_model_description_t;
  157. int pcilib_set_error_handler(void (*err)(const char *msg, ...), void (*warn)(const char *msg, ...));
  158. pcilib_model_t pcilib_get_model(pcilib_t *ctx);
  159. pcilib_model_description_t *pcilib_get_model_description(pcilib_t *ctx);
  160. pcilib_context_t *pcilib_get_implementation_context(pcilib_t *ctx);
  161. pcilib_t *pcilib_open(const char *device, pcilib_model_t model);
  162. void pcilib_close(pcilib_t *ctx);
  163. void *pcilib_map_bar(pcilib_t *ctx, pcilib_bar_t bar);
  164. void pcilib_unmap_bar(pcilib_t *ctx, pcilib_bar_t bar, void *data);
  165. char *pcilib_resolve_register_address(pcilib_t *ctx, pcilib_bar_t bar, uintptr_t addr); // addr is offset if bar is specified
  166. char *pcilib_resolve_data_space(pcilib_t *ctx, uintptr_t addr, size_t *size);
  167. pcilib_register_bank_t pcilib_find_bank_by_addr(pcilib_t *ctx, pcilib_register_bank_addr_t bank);
  168. pcilib_register_bank_t pcilib_find_bank_by_name(pcilib_t *ctx, const char *bankname);
  169. pcilib_register_bank_t pcilib_find_bank(pcilib_t *ctx, const char *bank);
  170. pcilib_register_t pcilib_find_register(pcilib_t *ctx, const char *bank, const char *reg);
  171. pcilib_event_t pcilib_find_event(pcilib_t *ctx, const char *event);
  172. pcilib_dma_engine_t pcilib_find_dma_by_addr(pcilib_t *ctx, pcilib_dma_direction_t direction, pcilib_dma_engine_addr_t dma);
  173. int pcilib_read(pcilib_t *ctx, pcilib_bar_t bar, uintptr_t addr, size_t size, void *buf);
  174. int pcilib_write(pcilib_t *ctx, pcilib_bar_t bar, uintptr_t addr, size_t size, void *buf);
  175. int pcilib_write_fifo(pcilib_t *ctx, pcilib_bar_t bar, uintptr_t addr, uint8_t fifo_size, size_t n, void *buf);
  176. int pcilib_read_fifo(pcilib_t *ctx, pcilib_bar_t bar, uintptr_t addr, uint8_t fifo_size, size_t n, void *buf);
  177. int pcilib_skip_dma(pcilib_t *ctx, pcilib_dma_engine_t dma);
  178. size_t pcilib_stream_dma(pcilib_t *ctx, pcilib_dma_engine_t dma, uintptr_t addr, size_t size, pcilib_dma_flags_t flags, size_t timeout, pcilib_dma_callback_t cb, void *cbattr);
  179. size_t pcilib_push_dma(pcilib_t *ctx, pcilib_dma_engine_t dma, uintptr_t addr, size_t size, pcilib_dma_flags_t flags, size_t timeout, void *buf);
  180. size_t pcilib_read_dma(pcilib_t *ctx, pcilib_dma_engine_t dma, uintptr_t addr, size_t size, void *buf);
  181. size_t pcilib_write_dma(pcilib_t *ctx, pcilib_dma_engine_t dma, uintptr_t addr, size_t size, void *buf);
  182. double pcilib_benchmark_dma(pcilib_t *ctx, pcilib_dma_engine_addr_t dma, uintptr_t addr, size_t size, size_t iterations, pcilib_dma_direction_t direction);
  183. int pcilib_read_register_space(pcilib_t *ctx, const char *bank, pcilib_register_addr_t addr, size_t n, pcilib_register_value_t *buf);
  184. int pcilib_write_register_space(pcilib_t *ctx, const char *bank, pcilib_register_addr_t addr, size_t n, pcilib_register_value_t *buf);
  185. int pcilib_read_register_by_id(pcilib_t *ctx, pcilib_register_t reg, pcilib_register_value_t *value);
  186. int pcilib_write_register_by_id(pcilib_t *ctx, pcilib_register_t reg, pcilib_register_value_t value);
  187. int pcilib_read_register(pcilib_t *ctx, const char *bank, const char *regname, pcilib_register_value_t *value);
  188. int pcilib_write_register(pcilib_t *ctx, const char *bank, const char *regname, pcilib_register_value_t value);
  189. int pcilib_reset(pcilib_t *ctx);
  190. int pcilib_start(pcilib_t *ctx, pcilib_event_t event_mask, void *callback, void *user);
  191. int pcilib_stop(pcilib_t *ctx);
  192. int pcilib_trigger(pcilib_t *ctx, pcilib_event_t event, size_t trigger_size, void *trigger_data);
  193. pcilib_event_id_t pcilib_get_next_event(pcilib_t *ctx, pcilib_event_t event_mask, const struct timespec *timeout);
  194. void *pcilib_get_data(pcilib_t *ctx, pcilib_event_id_t event_id, pcilib_event_data_type_t data_type, size_t *size);
  195. void *pcilib_get_data_with_argument(pcilib_t *ctx, pcilib_event_id_t event_id, pcilib_event_data_type_t data_type, size_t arg_size, void *arg, size_t *size);
  196. /*
  197. * This function is provided to find potentially corrupted data. If the data is overwritten by
  198. * the time return_data is called it will return error.
  199. */
  200. int pcilib_return_data(pcilib_t *ctx, pcilib_event_id_t event_id);
  201. /*
  202. * @param data - will be allocated and shuld be freed if NULL, otherwise used and size should contain correct size.
  203. * In case of failure the content of data is undefined.
  204. * @param timeout - will be autotriggered if NULL
  205. */
  206. int pcilib_grab(pcilib_t *ctx, pcilib_event_t event_mask, size_t *size, void **data, const struct timespec *timeout);
  207. #endif /* _PCITOOL_PCILIB_H */