NSUKit 1.4.0
板卡级统一交互接口
载入中...
搜索中...
未找到
xdma_api.h
浏览该文件的文档.
1//----------------------------------------------------------
2// XDMA common APIs
3//
4// for Xilinx DMA/Bridge Subsystem for PCI Express v4.1
5//
6// Note:
7// 1. Only support 1 MSI interrupt vector.
8// 2.
9//-----------------------------------------------------------
10#ifndef XDMA_API_H
11#define XDMA_API_H
12
13#define API_VERSION 20231209
14
15//v20231209 : 1. change MAX_NUM_CARDS to 32
16//driver 20231206 undef the __LIBXDMA_DEBUG__ based on 20221219
17//v20231206 : 1. test the ring mode
18//v20231010 : 1. fix the fpga_wait_dma() bug
19//v20230817 : 1. fix the build_descriptors() offset checking bug
20//v20230601 : 1. os_isr() desn't quit when read() return -1 and errono == 4.
21//v20230505 : 1. os_isr() quit when read() return <-1 more than 1000 times.
22//v20221219 : 1. add dma_t a magic_word to show if this dma_t is valid
23//v20220701 : 1. add user_irq debug information
24//v20220601 : 1. fpga_enable_dma_reg_verify() function
25//v20220418 : 1. fpga_open add the test_print parameter
26//v20211022 : 1. fix dma->channel updates when change chnl
27// 2. take double confirm for dma working check
28// 3. fpga_break_dma() got 500ms timeout
29
30
31#ifdef __APPLE__
32#define linux
33#endif
34
35#ifdef linux
36#define MIN_DRV_VERSION 20221219 //linux
37#endif
38
39#ifdef UNDER_RTSS
40#define MIN_DRV_VERSION 20201124 //rtx
41#endif
42
43#ifndef MIN_DRV_VERSION
44#define MIN_DRV_VERSION 2020710 //win64
45#endif
46
47#ifdef linux
48
49#define _API_CALL
50#define DLLEXPORT extern "C"
51
52#else //win, rtx
53
54#define _API_CALL __stdcall
55#define DLLEXPORT extern "C" __declspec(dllexport)
56#endif
57
58#define CHNL_NUM 4
59#define XDMA_INFO_STR_LEN 2047
60
61#ifndef NULL
62#define NULL nullptr
63#endif
64
65typedef void *HANDLE;
66
67//APIs for information
68DLLEXPORT unsigned int
69_API_CALL fpga_info_vendor_id(unsigned int boardn); // Device ID
70DLLEXPORT unsigned int
71_API_CALL fpga_info_device_id(unsigned int boardn); // Vendor ID
72DLLEXPORT unsigned int
73_API_CALL fpga_info_bus_num(unsigned int boardn); // Bus number
74DLLEXPORT unsigned int
75_API_CALL fpga_info_device_num(unsigned int boardn); // Device number
76DLLEXPORT unsigned int
77_API_CALL fpga_info_function_num(unsigned int boardn); // Function number
78DLLEXPORT unsigned int
79_API_CALL fpga_info_max_lane_width(unsigned int boardn); // Max lane width, 1 2 4 8 16 32
80DLLEXPORT unsigned int
81_API_CALL fpga_info_max_link_speed(unsigned int boardn); // Max link speed, 1=2.5G, 2=5G, 3=8G
82DLLEXPORT unsigned int
83_API_CALL fpga_info_lane_width(unsigned int boardn); // Working lane width, 1 2 4 8 16 32
84DLLEXPORT unsigned int
85_API_CALL fpga_info_link_speed(unsigned int boardn); // Working link speed, 1=2.5G, 2=5G, 3=8G
86DLLEXPORT unsigned int
87_API_CALL fpga_info_max_payload_size(unsigned int boardn); // Max payload size in bytes
88DLLEXPORT unsigned int
89_API_CALL fpga_info_max_readreq_size(unsigned int boardn); // Max read request size in bytes
90DLLEXPORT unsigned int
91_API_CALL fpga_info_msi_enable(unsigned int boardn); // MSI Interrupt enabled
92DLLEXPORT unsigned int
93_API_CALL fpga_info_msix_enable(unsigned int boardn); // MSIX Interrupt enabled
94DLLEXPORT unsigned int
95_API_CALL fpga_info_msi_num(unsigned int boardn); // Number of MSIX Interrupt vectors
96DLLEXPORT unsigned int
97_API_CALL fpga_info_axis_width(unsigned int boardn); // Bit width of AXIS interface
98DLLEXPORT unsigned int
99_API_CALL fpga_info_relaxed_ordering(unsigned int boardn); // Relaxed ordering
100DLLEXPORT unsigned int
101_API_CALL fpga_info_ip_version(unsigned int boardn); // IP core version
102DLLEXPORT unsigned int
103_API_CALL fpga_info_kernel_version(unsigned int boardn); // OS kernel driver version
104DLLEXPORT unsigned int
105_API_CALL fpga_info_api_version(unsigned int boardn); // API version
106DLLEXPORT unsigned int
107_API_CALL fpga_info_bar_num(unsigned int boardn); // Number of BARs
108DLLEXPORT unsigned int
109_API_CALL fpga_info_bar_reg(unsigned int boardn); // BAR index for XDMA control registers
110DLLEXPORT unsigned int
111_API_CALL fpga_info_bar_alite(unsigned int boardn); // BAR index for AXI Lite
112DLLEXPORT unsigned int
113_API_CALL fpga_info_bar_bypass(unsigned int boardn); // BAR index for DMA Bypass
114DLLEXPORT unsigned int
115_API_CALL fpga_info_chnl_num(unsigned int boardn, int c2h); // Dma channels count (0-H2C, 1-C2H)
116DLLEXPORT unsigned int
117_API_CALL fpga_info_stream(unsigned int boardn, int c2h, int chnl); // If the dma channel is AXI-Stream
118DLLEXPORT char *_API_CALL fpga_info_string(unsigned int boardn); // Information String
119
120//Open a board with board index = 0,1,2,...
121//poll_interval_ms: 0=interrupt mode; otherwise it's interrupt poll interval in millisecond
122//return true if successed.
123DLLEXPORT bool _API_CALL fpga_open(unsigned int boardn, unsigned int poll_interval_ms = 0, unsigned int test_print = 0);
124
125//Poll the interrupts
126//interval_ms: The polling period in milisecond. 0 = back to normal interrupt mode.
127//DLLEXPORT void _API_CALL fpga_set_pollmode(unsigned int boardn, unsigned int interval_ms);
128
129//Close a board and release all related dma objects.
130DLLEXPORT void _API_CALL fpga_close(unsigned int boardn);
131
132//Write a 32bit word to a XMDA engine control register
133DLLEXPORT void _API_CALL fpga_write_reg32(unsigned int boardn, unsigned int addr8, unsigned int data);
134
135//Read a 32bit word from a XMDA engine control register
136DLLEXPORT unsigned int _API_CALL fpga_read_reg32(unsigned int boardn, unsigned int addr8);
137
138//Write a 64bit word to a XMDA engine control register
139DLLEXPORT void _API_CALL fpga_write_reg64(unsigned int boardn, unsigned int addr8, unsigned long long data);
140
141//Read a 64bit word from a XMDA engine control register
142DLLEXPORT unsigned long long _API_CALL fpga_read_reg64(unsigned int boardn, unsigned int addr8);
143
144//Create a dma object with data buffer length for 32bit words
145//if buffer != NULL, driver will use this buffer, otherwise create new buffer.
146// Note: The buffer's start address must be a mulitple of 64.
147//if share_buffer is another dma_t, then share the data buffer.
148// Note: if the share_buffer != NULL, the buffer must = NULL.
150_API_CALL fpga_alloc_dma(unsigned int boardn, unsigned long long len32, void *buffer = NULL, HANDLE share_dma = NULL);
151//For C2H dma only. Beter performance potentially.
152DLLEXPORT HANDLE _API_CALL fpga_alloc_dma_recv(unsigned int boardn, unsigned long long len32, void *buffer = NULL,
153 HANDLE share_buffer = NULL);
154//For H2C dma only. Beter performance potentially.
155DLLEXPORT HANDLE _API_CALL fpga_alloc_dma_send(unsigned int boardn, unsigned long long len32, void *buffer = NULL,
156 HANDLE share_buffer = NULL);
157
158//Get the user data buffer start address of the dma object
160
161//free the dma buffer
163
164//Start a sending (h2c) dma.
165//boardn: board index.
166//chnl: dma channel. 0..3 (depends on IP)
167//dma: the dma object carries the data buffer.
168//len32: transfer length in 32bit words.
169//offset: data location (offset) in the dma buffer.
170//last: if it has a AXIS TLAST at the end of dma. Only for streaming.
171//mm_addr: address on the AXI4 MM interface. Only for MM.
172//mm_addr_inc: If the AXI4 MM address increases.
173//timeout: dma waiting timeout in milliseconds. -1= infinite. 0=no wait.
174//return the transfored data length in DWORDs.
175//return DMA_START_ERROR for dma start error. use fpga_err_msg() to the get detial error information.
176#define DMA_START_ERROR 0xffffffffffffffffULL
177#define DMA_NOWAIT 0
178#define DMA_WAIT_FOR_EVER 0xffffffff
179
180DLLEXPORT unsigned long long
181_API_CALL fpga_send(unsigned int boardn, unsigned int chnl, HANDLE dma, unsigned long long len32,
182 unsigned long long offset = 0,
183 unsigned int last = 1, unsigned int mm_addr = 0, unsigned int mm_addr_inc = 0,
184 unsigned int timeout = DMA_WAIT_FOR_EVER);
185
186//Start a receiving (c2h) dma
187//boardn: board index.
188//chnl: dma channel. 0..3 (depends on IP)
189//dma: the dma object carries the data buffer.
190//len32: transfer length in 32bit words.
191//offset: data location (offset) in the dma buffer.
192//last: if it has a AXIS TLAST at the end of dma. Only for streaming.
193//mm_addr: address on the AXI4 MM interface. Only for MM.
194//mm_addr_inc: If the AXI4 MM address increases.
195//timeout: dma waiting timeout in milliseconds. DMA_WAIT_FOR_EVER= infinite. 0=no wait.
196//return the transfored data length in DWORDs.
197//return DMA_START_ERROR for dma start error. use fpga_err_msg() to the get detial error information.
198DLLEXPORT unsigned long long
199_API_CALL fpga_recv(unsigned int boardn, unsigned int chnl, HANDLE dma, unsigned long long len32,
200 unsigned long long offset = 0,
201 unsigned int last = 1, unsigned int mm_addr = 0, unsigned int mm_addr_inc = 0,
202 unsigned int timeout = DMA_WAIT_FOR_EVER);
203
204//make a single recv dma for a dma objects array. this is for windows only.
205DLLEXPORT unsigned long long
206_API_CALL fpga_recv_multiple(unsigned int boardn, unsigned int chnl, HANDLE *dma_array, unsigned int dma_num,
207 unsigned long long len, unsigned long long offset, unsigned int last, unsigned int mm_addr,
208 unsigned int mm_addr_inc, unsigned int timeout);
209
210//Wait for a dma to complete,
211//if the fpga_send/recv() was called with no wait or returned with timeout.
212//dma: the dma object.
213//timeout: dma waiting timeout in milliseconds. DMA_WAIT_FOR_EVER= infinite. 0=no wait.
214//return the transfored data length in DWORDs.
215DLLEXPORT unsigned long long _API_CALL fpga_wait_dma(HANDLE dma, unsigned int timeout = DMA_WAIT_FOR_EVER);
216
217//if the last fpga_wait_dma() calling has timeout.
218//return 1 for timeout had happend.
220
221//get the transfered data length (in Dwords) of the dma
222DLLEXPORT unsigned long long _API_CALL fpga_poll_dma(HANDLE dma);
223
224//break the dma and return the transfered length in Dwords.
225DLLEXPORT unsigned long long _API_CALL fpga_break_dma(HANDLE dma);
226
227//pause the dma
229
230//resume the dma
232
233//Get speed of the last completed dma in MByte/s
235
236//write a 32bit data to the AXI-lite master interface
237DLLEXPORT void _API_CALL fpga_wr_lite(unsigned int boardn, unsigned int addr8, unsigned int data);
238
239//read a 32bit data from the AXI-lite master interface
240DLLEXPORT unsigned int _API_CALL fpga_rd_lite(unsigned int boardn, unsigned int addr8);
241
242//Wait for a user interrupts (0-15)
243//user_irq_num: the interrupt signal index, 0-15.
244//timeout: dma waiting timeout in milliseconds. DMA_WAIT_FOR_EVER= infinite. 0=no wait.
245//return 0 for success, !=0 for timeout or other error.
246DLLEXPORT unsigned int _API_CALL fpga_wait_irq(unsigned int boardn, unsigned int user_irq_num, unsigned int timeout);
247
248DLLEXPORT unsigned long long _API_CALL fpga_get_irq_ns(unsigned int boardn);
249
250//Setup a callback function for a user interrupt.
251//func: a C function with a void* parameter, return a int value.
252// The 'func' will be call once when the interrupt arriving.
253// Normally, the 'func' should return 1 and it will be called again at next interrupt.
254// If the 'func' returns 0, means no more callback, the interrupt will be disabled.
255//param: a void* being passed to the callback func.
256//return 1 for success
257DLLEXPORT unsigned int
258_API_CALL fpga_set_irq_callback(unsigned int boardn, unsigned int user_irq_num, int (*func)(void *), void *param);
259
260//Remove the callback function for a user interrupt.
261DLLEXPORT void _API_CALL fpga_remove_irq_callback(unsigned int boardn, unsigned int user_irq_num);
262
263//return the last error information string.
265
266//Create a ring buffer with length = len32 Dwords
267//The dma is always paused after the creation. Call fpga_ring_resume() to start the dma.
268//return the dma object.
270_API_CALL fpga_ring_create(unsigned int boardn, unsigned int chnl, unsigned int c2h, unsigned long long len32);
271
272//Pause the ring
273#define fpga_ring_pause(ring) fpga_pause_dma(ring)
274
275//Resume the ring
277
278//close the ring and free the resources
280
281//Break the dma and reset the ring.
283
284//Get a data buffer with specified lenght from the dma ring buffer.
285//For H2C dma ring, the data buffer is vacancy for application to fill new data.
286//For C2H dma ring, the data buffer is filled by the ealiest dma data for application to read and process.
287//If the data buffer is not avialable, the function will wait until timeout when timeout != 0.
288//dma: the dma object.
289//len32: length of new data in DWORDs.
290//timeout: dma waiting timeout in milliseconds. -1= infinite. 0=no wait.
291//return: data buffer pointer. NULL = unavialable or timeout.
292DLLEXPORT void *_API_CALL fpga_ring_next_buffer(HANDLE ring, unsigned long long len32, int timeout);
293
294//Get occupied data size (Dwords) in buffer
295DLLEXPORT unsigned long long _API_CALL fpga_ring_deep(HANDLE ring);
296
297//Print ring status into a string.
299
300//Read dma channel registers into a string
301DLLEXPORT void _API_CALL fpga_debug_dma_regs(unsigned int boardn, unsigned int chnl, unsigned int c2h, char *info);
302
303//Read interrupt registers into a string
304DLLEXPORT void _API_CALL fpga_debug_int_regs(unsigned int boardn, char *info);
305
306//Get the decriptors buffer point.
307// The desriptor buffer size = dma buffer size / 128
309
310DLLEXPORT int _API_CALL fpga_debug_test_regs_wr(unsigned int boardn, char *info);
311
312//Let the dma function to verify every dma register value
314
315
316#endif
#define NULL
Definition: xdma_api.h:62
DLLEXPORT void _API_CALL fpga_pause_dma(HANDLE dma)
DLLEXPORT unsigned int _API_CALL fpga_info_device_id(unsigned int boardn)
DLLEXPORT unsigned long long _API_CALL fpga_poll_dma(HANDLE dma)
DLLEXPORT unsigned int _API_CALL fpga_info_max_lane_width(unsigned int boardn)
DLLEXPORT HANDLE _API_CALL fpga_ring_create(unsigned int boardn, unsigned int chnl, unsigned int c2h, unsigned long long len32)
DLLEXPORT void _API_CALL fpga_free_dma(HANDLE dma)
DLLEXPORT void _API_CALL fpga_close(unsigned int boardn)
DLLEXPORT unsigned int _API_CALL fpga_info_stream(unsigned int boardn, int c2h, int chnl)
#define _API_CALL
Definition: xdma_api.h:54
DLLEXPORT unsigned int _API_CALL fpga_info_link_speed(unsigned int boardn)
DLLEXPORT unsigned long long _API_CALL fpga_recv_multiple(unsigned int boardn, unsigned int chnl, HANDLE *dma_array, unsigned int dma_num, unsigned long long len, unsigned long long offset, unsigned int last, unsigned int mm_addr, unsigned int mm_addr_inc, unsigned int timeout)
DLLEXPORT unsigned long long _API_CALL fpga_read_reg64(unsigned int boardn, unsigned int addr8)
DLLEXPORT void _API_CALL fpga_ring_get_info(HANDLE _dma, char *info)
DLLEXPORT unsigned long long _API_CALL fpga_send(unsigned int boardn, unsigned int chnl, HANDLE dma, unsigned long long len32, unsigned long long offset=0, unsigned int last=1, unsigned int mm_addr=0, unsigned int mm_addr_inc=0, unsigned int timeout=DMA_WAIT_FOR_EVER)
DLLEXPORT void _API_CALL fpga_ring_reset(HANDLE ring)
DLLEXPORT unsigned int _API_CALL fpga_info_device_num(unsigned int boardn)
DLLEXPORT int _API_CALL fpga_dma_timeout(HANDLE dma)
DLLEXPORT void _API_CALL fpga_write_reg64(unsigned int boardn, unsigned int addr8, unsigned long long data)
DLLEXPORT void _API_CALL fpga_ring_close(HANDLE ring)
DLLEXPORT char *_API_CALL fpga_debug_get_descs(HANDLE dma)
DLLEXPORT unsigned long long _API_CALL fpga_get_irq_ns(unsigned int boardn)
DLLEXPORT unsigned int _API_CALL fpga_info_relaxed_ordering(unsigned int boardn)
DLLEXPORT void _API_CALL fpga_debug_int_regs(unsigned int boardn, char *info)
DLLEXPORT unsigned int _API_CALL fpga_info_bar_num(unsigned int boardn)
DLLEXPORT unsigned int _API_CALL fpga_info_bus_num(unsigned int boardn)
DLLEXPORT int _API_CALL fpga_debug_test_regs_wr(unsigned int boardn, char *info)
DLLEXPORT unsigned int _API_CALL fpga_info_max_link_speed(unsigned int boardn)
DLLEXPORT unsigned int _API_CALL fpga_info_vendor_id(unsigned int boardn)
DLLEXPORT unsigned int _API_CALL fpga_rd_lite(unsigned int boardn, unsigned int addr8)
#define DLLEXPORT
Definition: xdma_api.h:55
DLLEXPORT unsigned int _API_CALL fpga_info_chnl_num(unsigned int boardn, int c2h)
DLLEXPORT HANDLE _API_CALL fpga_alloc_dma(unsigned int boardn, unsigned long long len32, void *buffer=NULL, HANDLE share_dma=NULL)
DLLEXPORT unsigned int _API_CALL fpga_info_kernel_version(unsigned int boardn)
DLLEXPORT void _API_CALL fpga_remove_irq_callback(unsigned int boardn, unsigned int user_irq_num)
DLLEXPORT unsigned int _API_CALL fpga_info_bar_bypass(unsigned int boardn)
DLLEXPORT void _API_CALL fpga_wr_lite(unsigned int boardn, unsigned int addr8, unsigned int data)
DLLEXPORT unsigned int _API_CALL fpga_info_max_payload_size(unsigned int boardn)
DLLEXPORT unsigned int _API_CALL fpga_info_axis_width(unsigned int boardn)
void * HANDLE
Definition: xdma_api.h:65
DLLEXPORT unsigned long long _API_CALL fpga_recv(unsigned int boardn, unsigned int chnl, HANDLE dma, unsigned long long len32, unsigned long long offset=0, unsigned int last=1, unsigned int mm_addr=0, unsigned int mm_addr_inc=0, unsigned int timeout=DMA_WAIT_FOR_EVER)
DLLEXPORT unsigned int _API_CALL fpga_info_msix_enable(unsigned int boardn)
DLLEXPORT void _API_CALL fpga_enable_dma_reg_verify(unsigned int boardn)
DLLEXPORT unsigned int _API_CALL fpga_info_ip_version(unsigned int boardn)
DLLEXPORT unsigned int _API_CALL fpga_info_max_readreq_size(unsigned int boardn)
DLLEXPORT unsigned int _API_CALL fpga_info_msi_num(unsigned int boardn)
DLLEXPORT void _API_CALL fpga_resume_dma(HANDLE dma)
DLLEXPORT unsigned long long _API_CALL fpga_break_dma(HANDLE dma)
DLLEXPORT char *_API_CALL fpga_info_string(unsigned int boardn)
DLLEXPORT unsigned int _API_CALL fpga_info_bar_alite(unsigned int boardn)
DLLEXPORT void _API_CALL fpga_debug_dma_regs(unsigned int boardn, unsigned int chnl, unsigned int c2h, char *info)
DLLEXPORT double fpga_get_dma_speed(HANDLE dma)
DLLEXPORT unsigned int _API_CALL fpga_read_reg32(unsigned int boardn, unsigned int addr8)
DLLEXPORT unsigned int _API_CALL fpga_info_api_version(unsigned int boardn)
DLLEXPORT unsigned int _API_CALL fpga_info_msi_enable(unsigned int boardn)
DLLEXPORT void _API_CALL fpga_ring_resume(HANDLE ring)
DLLEXPORT void *_API_CALL fpga_ring_next_buffer(HANDLE ring, unsigned long long len32, int timeout)
DLLEXPORT HANDLE _API_CALL fpga_alloc_dma_send(unsigned int boardn, unsigned long long len32, void *buffer=NULL, HANDLE share_buffer=NULL)
DLLEXPORT unsigned int _API_CALL fpga_set_irq_callback(unsigned int boardn, unsigned int user_irq_num, int(*func)(void *), void *param)
DLLEXPORT unsigned long long _API_CALL fpga_ring_deep(HANDLE ring)
#define DMA_WAIT_FOR_EVER
Definition: xdma_api.h:178
DLLEXPORT void * fpga_get_dma_buffer(HANDLE dma)
DLLEXPORT bool _API_CALL fpga_open(unsigned int boardn, unsigned int poll_interval_ms=0, unsigned int test_print=0)
DLLEXPORT HANDLE _API_CALL fpga_alloc_dma_recv(unsigned int boardn, unsigned long long len32, void *buffer=NULL, HANDLE share_buffer=NULL)
DLLEXPORT unsigned long long _API_CALL fpga_wait_dma(HANDLE dma, unsigned int timeout=DMA_WAIT_FOR_EVER)
DLLEXPORT unsigned int _API_CALL fpga_info_bar_reg(unsigned int boardn)
DLLEXPORT char *_API_CALL fpga_err_msg(void)
DLLEXPORT unsigned int _API_CALL fpga_info_function_num(unsigned int boardn)
DLLEXPORT unsigned int _API_CALL fpga_info_lane_width(unsigned int boardn)
DLLEXPORT void _API_CALL fpga_write_reg32(unsigned int boardn, unsigned int addr8, unsigned int data)
DLLEXPORT unsigned int _API_CALL fpga_wait_irq(unsigned int boardn, unsigned int user_irq_num, unsigned int timeout)