OpenCores
URL https://opencores.org/ocsvn/usb_fpga_2_14/usb_fpga_2_14/trunk

Subversion Repositories usb_fpga_2_14

[/] [usb_fpga_2_14/] [trunk/] [docs/] [c/] [html/] [memfifo_8c.html] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 ZTEX
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
2
<html xmlns="http://www.w3.org/1999/xhtml">
3
<head>
4
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
5
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
6
<meta name="generator" content="Doxygen 1.8.8"/>
7
<title>ZTEX core API for C: memfifo.c File Reference</title>
8
<link href="tabs.css" rel="stylesheet" type="text/css"/>
9
<script type="text/javascript" src="jquery.js"></script>
10
<script type="text/javascript" src="dynsections.js"></script>
11
<link href="navtree.css" rel="stylesheet" type="text/css"/>
12
<script type="text/javascript" src="resize.js"></script>
13
<script type="text/javascript" src="navtree.js"></script>
14
<script type="text/javascript">
15
  $(document).ready(initResizable);
16
  $(window).load(resizeHeight);
17
</script>
18
<link href="search/search.css" rel="stylesheet" type="text/css"/>
19
<script type="text/javascript" src="search/search.js"></script>
20
<script type="text/javascript">
21
  $(document).ready(function() { searchBox.OnSelectItem(0); });
22
</script>
23
<link href="doxygen.css" rel="stylesheet" type="text/css" />
24
</head>
25
<body>
26
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
27
<div id="titlearea">
28
<table cellspacing="0" cellpadding="0">
29
 <tbody>
30
 <tr style="height: 56px;">
31
  <td style="padding-left: 0.5em;">
32
   <div id="projectname">ZTEX core API for C
33
   </div>
34
   <div id="projectbrief">Host software API for ZTEX FPGA Boards for C</div>
35
  </td>
36
 </tr>
37
 </tbody>
38
</table>
39
</div>
40
<!-- end header part -->
41
<!-- Generated by Doxygen 1.8.8 -->
42
<script type="text/javascript">
43
var searchBox = new SearchBox("searchBox", "search",false,'Search');
44
</script>
45
  <div id="navrow1" class="tabs">
46
    <ul class="tablist">
47
      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
48
      <li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
49
      <li class="current"><a href="files.html"><span>Files</span></a></li>
50
      <li>
51
        <div id="MSearchBox" class="MSearchBoxInactive">
52
        <span class="left">
53
          <img id="MSearchSelect" src="search/mag_sel.png"
54
               onmouseover="return searchBox.OnSearchSelectShow()"
55
               onmouseout="return searchBox.OnSearchSelectHide()"
56
               alt=""/>
57
          <input type="text" id="MSearchField" value="Search" accesskey="S"
58
               onfocus="searchBox.OnSearchFieldFocus(true)"
59
               onblur="searchBox.OnSearchFieldFocus(false)"
60
               onkeyup="searchBox.OnSearchFieldChange(event)"/>
61
          </span><span class="right">
62
            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
63
          </span>
64
        </div>
65
      </li>
66
    </ul>
67
  </div>
68
  <div id="navrow2" class="tabs2">
69
    <ul class="tablist">
70
      <li><a href="files.html"><span>File&#160;List</span></a></li>
71
      <li><a href="globals.html"><span>Globals</span></a></li>
72
    </ul>
73
  </div>
74
</div><!-- top -->
75
<div id="side-nav" class="ui-resizable side-nav-resizable">
76
  <div id="nav-tree">
77
    <div id="nav-tree-contents">
78
      <div id="nav-sync" class="sync"></div>
79
    </div>
80
  </div>
81
  <div id="splitbar" style="-moz-user-select:none;"
82
       class="ui-resizable-handle">
83
  </div>
84
</div>
85
<script type="text/javascript">
86
$(document).ready(function(){initNavTree('memfifo_8c.html','');});
87
</script>
88
<div id="doc-content">
89
<!-- window showing the filter options -->
90
<div id="MSearchSelectWindow"
91
     onmouseover="return searchBox.OnSearchSelectShow()"
92
     onmouseout="return searchBox.OnSearchSelectHide()"
93
     onkeydown="return searchBox.OnSearchSelectKey(event)">
94
<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Data Structures</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Variables</a></div>
95
 
96
<!-- iframe showing the search results (closed by default) -->
97
<div id="MSearchResultsWindow">
98
<iframe src="javascript:void(0)" frameborder="0"
99
        name="MSearchResults" id="MSearchResults">
100
</iframe>
101
</div>
102
 
103
<div class="header">
104
  <div class="headertitle">
105
<div class="title">memfifo.c File Reference</div>  </div>
106
</div><!--header-->
107
<div class="contents">
108
 
109
<p>memfifo example for C.
110
<a href="#details">More...</a></p>
111
<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
112
<div class="textblock"><p>memfifo example for C. </p>
113
<p>This example demonstrates the usage of the C API and the high speed interface of the default firmware.</p>
114
<p>It performs certain tests (device and data integrity, read-write tests, performance) using the memory FIFO as described on <a href="http://wiki.ztex.de/doku.php?id=en:ztex_boards:ztex_fpga_boards:memfifo:memfifo">memfifo example</a>.</p>
115
<p>The correct bitstream is detected and found automatically if the binary is executed from the directory tree of the SDK. Otherwise it can be specified with parameter '-s'.</p>
116
<p>Full list of options can be obtained with '-h' </p><div class="fragment"><div class="line"><span class="comment">/*#</span></div>
117
<div class="line"><span class="comment">   ZTEX Core API for C with examples</span></div>
118
<div class="line"><span class="comment">   Copyright (C) 2009-2017 ZTEX GmbH.</span></div>
119
<div class="line"><span class="comment">   http://www.ztex.de</span></div>
120
<div class="line"><span class="comment"></span></div>
121
<div class="line"><span class="comment">   This program is free software; you can redistribute it and/or modify</span></div>
122
<div class="line"><span class="comment">   it under the terms of the GNU General Public License version 3 as</span></div>
123
<div class="line"><span class="comment">   published by the Free Software Foundation.</span></div>
124
<div class="line"><span class="comment"></span></div>
125
<div class="line"><span class="comment">   This program is distributed in the hope that it will be useful, but</span></div>
126
<div class="line"><span class="comment">   WITHOUT ANY WARRANTY; without even the implied warranty of</span></div>
127
<div class="line"><span class="comment">   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU</span></div>
128
<div class="line"><span class="comment">   General Public License for more details.</span></div>
129
<div class="line"><span class="comment"></span></div>
130
<div class="line"><span class="comment">   You should have received a copy of the GNU General Public License</span></div>
131
<div class="line"><span class="comment">   along with this program; if not, see http://www.gnu.org/licenses/.</span></div>
132
<div class="line"><span class="comment">#*/</span></div>
133
<div class="line"></div>
134
<div class="line"><span class="preprocessor">#include &lt;stdio.h&gt;</span></div>
135
<div class="line"><span class="preprocessor">#include &lt;stdarg.h&gt;</span></div>
136
<div class="line"><span class="preprocessor">#include &lt;stdlib.h&gt;</span></div>
137
<div class="line"><span class="preprocessor">#include &lt;string.h&gt;</span></div>
138
<div class="line"><span class="preprocessor">#include &lt;fcntl.h&gt;</span></div>
139
<div class="line"><span class="preprocessor">#include &lt;sys/types.h&gt;</span></div>
140
<div class="line"><span class="preprocessor">#include &lt;sys/time.h&gt;</span></div>
141
<div class="line"><span class="preprocessor">#include &lt;libusb-1.0/libusb.h&gt;</span></div>
142
<div class="line"></div>
143
<div class="line"><span class="preprocessor">#include &quot;<a class="code" href="ztex_8h.html">ztex.h</a>&quot;</span></div>
144
<div class="line"></div>
145
<div class="line"><span class="preprocessor">#define BULK_BUF_SIZE 4*1024*1024</span></div>
146
<div class="line"><span class="preprocessor">#define RW_SIZE 65000                   // must be smaller then FIFO size, 64K on USB-FPGA Module 2.01</span></div>
147
<div class="line"></div>
148
<div class="line"><span class="keyword">static</span> <span class="keywordtype">char</span>* prog_name = NULL;          <span class="comment">// name of the program</span></div>
149
<div class="line"></div>
150
<div class="line"><span class="keyword">static</span> <span class="keywordtype">int</span> paramerr(<span class="keyword">const</span> <span class="keywordtype">char</span>* format,...)</div>
151
<div class="line">{</div>
152
<div class="line">    fprintf(stderr, <span class="stringliteral">&quot;Usage: %s options\n&quot;</span>,prog_name);</div>
153
<div class="line">    fprintf(stderr, <span class="stringliteral">&quot;  -h                           Display this usage information\n&quot;</span></div>
154
<div class="line">                    <span class="stringliteral">&quot;  -fu &lt;vendor ID&gt;:&lt;product ID&gt; Select device by USB IDs, default: 0x221A:0x100, &lt;0:ignore ID\n&quot;</span></div>
155
<div class="line">                    <span class="stringliteral">&quot;  -fd &lt;bus&gt;:&lt;device&gt;           Select device by bus number and device address\n&quot;</span></div>
156
<div class="line">                    <span class="stringliteral">&quot;  -fs &lt;string&gt;                 Select device by serial number string\n&quot;</span></div>
157
<div class="line">                    <span class="stringliteral">&quot;  -fp &lt;string&gt;                 Select device by product string\n&quot;</span></div>
158
<div class="line">                    <span class="stringliteral">&quot;  -s &lt;path&gt;                    Additional search path for bitstream, default &#39;..&quot;</span>DIRSEP<span class="stringliteral">&quot;..&quot;</span>DIRSEP<span class="stringliteral">&quot;examples&quot;</span>DIRSEP<span class="stringliteral">&quot;memfifo&#39;\n&quot;</span></div>
159
<div class="line">                    <span class="stringliteral">&quot;  -r                           Reset device (default: reset configuration only)\n&quot;</span></div>
160
<div class="line">                    <span class="stringliteral">&quot;  -i                           Print device info\n&quot;</span></div>
161
<div class="line">                    <span class="stringliteral">&quot;  -p                           Print matching USB devices\n&quot;</span></div>
162
<div class="line">                    <span class="stringliteral">&quot;  -pa                          Print all USB devices\n&quot;</span></div>
163
<div class="line">            );</div>
164
<div class="line">    <span class="keywordflow">if</span> ( format ) {</div>
165
<div class="line">        va_list args;</div>
166
<div class="line">        va_start(args,format);</div>
167
<div class="line">        vfprintf(stderr, format, args);</div>
168
<div class="line">        va_end(args);</div>
169
<div class="line">        <span class="keywordflow">return</span> 1;</div>
170
<div class="line">    }</div>
171
<div class="line">    <span class="keywordflow">return</span> 0;</div>
172
<div class="line">}</div>
173
<div class="line"></div>
174
<div class="line"><span class="keywordtype">int</span> main(<span class="keywordtype">int</span> argc, <span class="keywordtype">char</span> **argv)</div>
175
<div class="line">{</div>
176
<div class="line">    <span class="keywordtype">int</span> id_vendor = 0x221A;     <span class="comment">// ZTEX vendor ID</span></div>
177
<div class="line">    <span class="keywordtype">int</span> id_product = 0x100;     <span class="comment">// default product ID for ZTEX firmware</span></div>
178
<div class="line">    <span class="keywordtype">int</span> status = 0;</div>
179
<div class="line">    libusb_device **devs = NULL;</div>
180
<div class="line">    <span class="keywordtype">int</span> print_all=0, print=0, print_info=0, reset_dev=0;</div>
181
<div class="line">    <span class="keywordtype">int</span> busnum = -1, devnum = -1;</div>
182
<div class="line">    <span class="keywordtype">char</span> *sn_string = NULL, *product_string = NULL;</div>
183
<div class="line">    libusb_device_handle *handle = NULL;</div>
184
<div class="line">    <a class="code" href="structztex__device__info.html">ztex_device_info</a> info;</div>
185
<div class="line">    <span class="keywordtype">char</span> *bitstream_fn = NULL, *bitstream_path = NULL;</div>
186
<div class="line">    <span class="keywordtype">char</span> sbuf[8192];</div>
187
<div class="line">    <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *mbuf = NULL;</div>
188
<div class="line">    <span class="keywordtype">int</span> transferred, size;</div>
189
<div class="line">    <span class="keyword">struct </span>timeval tv1,tv2;</div>
190
<div class="line"></div>
191
<div class="line">    <span class="comment">// process parameters</span></div>
192
<div class="line">    prog_name = argv[0];</div>
193
<div class="line">    <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i=1; i&lt;argc; i++) {</div>
194
<div class="line">        <span class="keywordflow">if</span> ( !strcmp(argv[i],<span class="stringliteral">&quot;-h&quot;</span>) ) <span class="keywordflow">return</span> paramerr(NULL);</div>
195
<div class="line">        <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( !strcmp(argv[i],<span class="stringliteral">&quot;-p&quot;</span>) ) print=1;</div>
196
<div class="line">        <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( !strcmp(argv[i],<span class="stringliteral">&quot;-pa&quot;</span>) ) print_all=1;</div>
197
<div class="line">        <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( !strcmp(argv[i],<span class="stringliteral">&quot;-i&quot;</span>) ) print_info=1;</div>
198
<div class="line">        <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( !strcmp(argv[i],<span class="stringliteral">&quot;-r&quot;</span>) ) reset_dev=1;</div>
199
<div class="line">        <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( !strcmp(argv[i],<span class="stringliteral">&quot;-fu&quot;</span>) ) {</div>
200
<div class="line">            i++;</div>
201
<div class="line">            <span class="keywordflow">if</span> (i&gt;=argc || sscanf(argv[i],<span class="stringliteral">&quot;%i:%i&quot;</span>, &amp;id_vendor, &amp;id_product)!=2 ) <span class="keywordflow">return</span> paramerr(<span class="stringliteral">&quot;Error: &lt;vendor ID&gt;:&lt;product ID&gt; expected after -fu\n&quot;</span>);</div>
202
<div class="line">        }</div>
203
<div class="line">        <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( !strcmp(argv[i],<span class="stringliteral">&quot;-fd&quot;</span>) ) {</div>
204
<div class="line">            i++;</div>
205
<div class="line">            <span class="keywordflow">if</span> (i&gt;=argc || sscanf(argv[i],<span class="stringliteral">&quot;%i:%i&quot;</span>, &amp;busnum, &amp;devnum)!=2 ) <span class="keywordflow">return</span> paramerr(<span class="stringliteral">&quot;Error: &lt;bus&gt;:&lt;device&gt; expected after -fd\n&quot;</span>);</div>
206
<div class="line">        }</div>
207
<div class="line">        <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( !strcmp(argv[i],<span class="stringliteral">&quot;-fs&quot;</span>) ) {</div>
208
<div class="line">            i++;</div>
209
<div class="line">            <span class="keywordflow">if</span> (i&gt;=argc ) <span class="keywordflow">return</span> paramerr(<span class="stringliteral">&quot;Error: &lt;string&gt; expected after -fs\n&quot;</span>);</div>
210
<div class="line">            sn_string = argv[i];</div>
211
<div class="line">        }</div>
212
<div class="line">        <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( !strcmp(argv[i],<span class="stringliteral">&quot;-fp&quot;</span>) ) {</div>
213
<div class="line">            i++;</div>
214
<div class="line">            <span class="keywordflow">if</span> (i&gt;=argc ) <span class="keywordflow">return</span> paramerr(<span class="stringliteral">&quot;Error: &lt;string&gt; expected after -fp\n&quot;</span>);</div>
215
<div class="line">            product_string = argv[i];</div>
216
<div class="line">        }</div>
217
<div class="line">        <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( !strcmp(argv[i],<span class="stringliteral">&quot;-s&quot;</span>) ) {</div>
218
<div class="line">            i++;</div>
219
<div class="line">            <span class="keywordflow">if</span> (i&gt;=argc ) <span class="keywordflow">return</span> paramerr(<span class="stringliteral">&quot;Error: &lt;path&gt; expected after -s\n&quot;</span>);</div>
220
<div class="line">            bitstream_path = argv[i];</div>
221
<div class="line">        }</div>
222
<div class="line">        <span class="keywordflow">else</span> <span class="keywordflow">return</span> paramerr(<span class="stringliteral">&quot;Error: Invalid parameter %s\n&quot;</span>, argv[i]);</div>
223
<div class="line">    }</div>
224
<div class="line">    </div>
225
<div class="line">    </div>
226
<div class="line">    <span class="comment">// INIT libusb</span></div>
227
<div class="line">    status = libusb_init(NULL);</div>
228
<div class="line">    <span class="keywordflow">if</span> (status &lt; 0) {</div>
229
<div class="line">        fprintf(stderr,<span class="stringliteral">&quot;Error: Unable to init libusb: %s\n&quot;</span>, libusb_error_name(status));</div>
230
<div class="line">        <span class="keywordflow">return</span> 1;</div>
231
<div class="line">    }</div>
232
<div class="line"></div>
233
<div class="line">    <span class="comment">// find all USB devices</span></div>
234
<div class="line">    status = libusb_get_device_list(NULL, &amp;devs);</div>
235
<div class="line">    <span class="keywordflow">if</span> (status &lt; 0) {</div>
236
<div class="line">        fprintf(stderr,<span class="stringliteral">&quot;Error: Unable to get device list: %s\n&quot;</span>, libusb_error_name(status));</div>
237
<div class="line">        <span class="keywordflow">goto</span> err;</div>
238
<div class="line">    }</div>
239
<div class="line">    </div>
240
<div class="line">    <span class="comment">// print bus info or find device</span></div>
241
<div class="line">    <span class="keywordtype">int</span> dev_idx = <a class="code" href="ztex_8h.html#a8ee4c93eef23fbc8044347a7ce351cf5">ztex_scan_bus</a>(sbuf, <span class="keyword">sizeof</span>(sbuf), devs, print_all ? -1 : print ? 1 : 0, id_vendor, id_product, busnum, devnum, sn_string, product_string);</div>
242
<div class="line">    printf(sbuf);</div>
243
<div class="line">    fflush(stdout);</div>
244
<div class="line">    <span class="keywordflow">if</span> ( print || print_all ) {</div>
245
<div class="line">        status = 0;</div>
246
<div class="line">        <span class="keywordflow">goto</span> noerr;</div>
247
<div class="line">    } <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( dev_idx&lt;0 ) {</div>
248
<div class="line">        <span class="keywordflow">if</span> (dev_idx==-1) fprintf(stderr,<span class="stringliteral">&quot;Error: No device found\n&quot;</span>);</div>
249
<div class="line">        <span class="keywordflow">goto</span> err;</div>
250
<div class="line">    }</div>
251
<div class="line"></div>
252
<div class="line">    <span class="comment">// open device</span></div>
253
<div class="line">    status = libusb_open(devs[dev_idx], &amp;handle);</div>
254
<div class="line">    <span class="keywordflow">if</span> (status &lt; 0) {</div>
255
<div class="line">        fprintf(stderr,<span class="stringliteral">&quot;Error: Unable to open device: %s\n&quot;</span>, libusb_error_name(status));</div>
256
<div class="line">        <span class="keywordflow">goto</span> err;</div>
257
<div class="line">    }</div>
258
<div class="line">    libusb_free_device_list(devs, 1);</div>
259
<div class="line">    devs=NULL;</div>
260
<div class="line">    </div>
261
<div class="line">    <span class="comment">// reset configuration or device</span></div>
262
<div class="line">   <span class="keywordflow">if</span> ( ! reset_dev ) {</div>
263
<div class="line">        status = libusb_set_configuration(handle,-1);</div>
264
<div class="line">        <span class="keywordflow">if</span> (status &lt; 0) {</div>
265
<div class="line">            fprintf(stderr,<span class="stringliteral">&quot;Warning: Unable to unconfigure device: %s, trying to reset it\n&quot;</span>, libusb_error_name(status));</div>
266
<div class="line"><span class="preprocessor">#if defined(WIN32) || defined(_WIN32) || defined(WIN64) || defined(_WIN64)</span></div>
267
<div class="line">            fprintf(stderr,<span class="stringliteral">&quot;Due to limitations of Windows neither this nor device reset works. This may cause further errors ...\n&quot;</span>);</div>
268
<div class="line"><span class="preprocessor">#endif    </span></div>
269
<div class="line">            reset_dev = 1;</div>
270
<div class="line">        }</div>
271
<div class="line">    }</div>
272
<div class="line">    <span class="keywordflow">if</span> ( reset_dev ) {</div>
273
<div class="line">        status = libusb_reset_device(handle);</div>
274
<div class="line">        <span class="keywordflow">if</span> (status &lt; 0) {</div>
275
<div class="line">            fprintf(stderr,<span class="stringliteral">&quot;Error: Unable to reset device: %s\n&quot;</span>, libusb_error_name(status));</div>
276
<div class="line">            <span class="keywordflow">goto</span> err;</div>
277
<div class="line">        }</div>
278
<div class="line">    }</div>
279
<div class="line">    status = libusb_set_configuration(handle,1);</div>
280
<div class="line">    <span class="keywordflow">if</span> (status &lt; 0) fprintf(stderr,<span class="stringliteral">&quot;Warning: Unable to set configuration 1: %s\n&quot;</span>, libusb_error_name(status));</div>
281
<div class="line">    fflush(stderr);</div>
282
<div class="line"></div>
283
<div class="line">    <span class="comment">// get and print device info</span></div>
284
<div class="line">    status = <a class="code" href="ztex_8h.html#a28cef9d1e168b782b03579c4a59505d3">ztex_get_device_info</a>(handle, &amp;info);</div>
285
<div class="line">    <span class="keywordflow">if</span> ( status &lt; 0 ) {</div>
286
<div class="line">        fprintf(stderr,<span class="stringliteral">&quot;Error: Unable to get device info: %s\n&quot;</span>, libusb_error_name(status));</div>
287
<div class="line">        <span class="keywordflow">goto</span> err;</div>
288
<div class="line">    }</div>
289
<div class="line">    <span class="keywordflow">if</span> ( print_info ) {</div>
290
<div class="line">        <a class="code" href="ztex_8h.html#aa64c1cefed076a0f48cafa1882593c79">ztex_print_device_info</a>( sbuf, <span class="keyword">sizeof</span>(sbuf), &amp;info );</div>
291
<div class="line">        printf(sbuf);</div>
292
<div class="line">        status = <a class="code" href="ztex_8h.html#ae679e66864c90211a3d8b4670a64d497">ztex_get_fpga_config</a>(handle);</div>
293
<div class="line">        <span class="keywordflow">if</span> ( status &lt; 0 ) {</div>
294
<div class="line">            fprintf(stderr,<span class="stringliteral">&quot;Error: Unable to get FPGA configuration state: %s\n&quot;</span>, libusb_error_name(status));</div>
295
<div class="line">            <span class="keywordflow">goto</span> err;</div>
296
<div class="line">        }</div>
297
<div class="line">        printf(<span class="stringliteral">&quot;FPGA: %s\n&quot;</span>, status==0 ? <span class="stringliteral">&quot;unconfigured&quot;</span> : <span class="stringliteral">&quot;configured&quot;</span>);</div>
298
<div class="line">        status = 0;</div>
299
<div class="line">        <span class="keywordflow">goto</span> noerr;</div>
300
<div class="line">    }</div>
301
<div class="line">    </div>
302
<div class="line">    <span class="comment">// find bitstream</span></div>
303
<div class="line">    bitstream_fn = <a class="code" href="ztex_8h.html#a74c89f5aa7e3754d88f1dc95846b5cbe">ztex_find_bitstream</a>( &amp;info, bitstream_path ? bitstream_path : <span class="stringliteral">&quot;..&quot;</span>DIRSEP<span class="stringliteral">&quot;..&quot;</span>DIRSEP<span class="stringliteral">&quot;examples&quot;</span>DIRSEP<span class="stringliteral">&quot;memfifo&quot;</span> , <span class="stringliteral">&quot;memfifo&quot;</span>);</div>
304
<div class="line">    <span class="keywordflow">if</span> ( bitstream_fn )  {</div>
305
<div class="line">        printf(<span class="stringliteral">&quot;Using bitstream &#39;%s&#39;\n&quot;</span>, bitstream_fn);</div>
306
<div class="line">        fflush(stdout);</div>
307
<div class="line">    }</div>
308
<div class="line">    <span class="keywordflow">else</span> {</div>
309
<div class="line">        fprintf(stderr,<span class="stringliteral">&quot;Warning: Bitstream not found\n&quot;</span>);</div>
310
<div class="line">        <span class="keywordflow">goto</span> nobitstream;</div>
311
<div class="line">    }</div>
312
<div class="line">    </div>
313
<div class="line">    <span class="comment">// read and upload bitstream</span></div>
314
<div class="line">    FILE *fd = fopen(bitstream_fn, <span class="stringliteral">&quot;rb&quot;</span>);</div>
315
<div class="line">    <span class="keywordflow">if</span> ( fd == NULL ) {</div>
316
<div class="line">        fprintf(stderr,<span class="stringliteral">&quot;Warning: Error opening file &#39;%s&#39;\n&quot;</span>, bitstream_fn);</div>
317
<div class="line">        <span class="keywordflow">goto</span> nobitstream;</div>
318
<div class="line">    }</div>
319
<div class="line">    status = <a class="code" href="ztex_8h.html#a1861aa844f2ad3cacf37bbde0f9d6bcb">ztex_upload_bitstream</a>(sbuf,<span class="keyword">sizeof</span>(sbuf),handle,&amp;info,fd,-1);</div>
320
<div class="line">    fclose(fd);</div>
321
<div class="line">    fprintf(stderr,sbuf);</div>
322
<div class="line"></div>
323
<div class="line">nobitstream:</div>
324
<div class="line">    fflush(stderr);</div>
325
<div class="line">    <span class="comment">// check config</span></div>
326
<div class="line">    status = <a class="code" href="ztex_8h.html#ae679e66864c90211a3d8b4670a64d497">ztex_get_fpga_config</a>(handle);</div>
327
<div class="line">    <span class="keywordflow">if</span> ( status &lt; 0 ) {</div>
328
<div class="line">        fprintf(stderr,<span class="stringliteral">&quot;Error: Unable to get FPGA configuration state: %s\n&quot;</span>, libusb_error_name(status));</div>
329
<div class="line">        <span class="keywordflow">goto</span> err;</div>
330
<div class="line">    } <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( status == 0 ) {</div>
331
<div class="line">        fprintf(stderr,<span class="stringliteral">&quot;Error: FPGA not configured\n&quot;</span>);</div>
332
<div class="line">        <span class="keywordflow">goto</span> err;</div>
333
<div class="line">    }</div>
334
<div class="line"></div>
335
<div class="line">    <span class="comment">// claim interface</span></div>
336
<div class="line">    status = libusb_claim_interface(handle, 0); </div>
337
<div class="line">    <span class="keywordflow">if</span> ( status &lt; 0 ) {</div>
338
<div class="line">        fprintf(stderr,<span class="stringliteral">&quot;Error claiming interface 0: %s\n&quot;</span>, libusb_error_name(status));</div>
339
<div class="line">        <span class="keywordflow">goto</span> err;</div>
340
<div class="line">    }</div>
341
<div class="line"></div>
342
<div class="line">    mbuf = malloc(BULK_BUF_SIZE);</div>
343
<div class="line">    <span class="keywordflow">if</span> ( !mbuf ) {</div>
344
<div class="line">        fprintf(stderr,<span class="stringliteral">&quot;Error allocating %d bytes\n&quot;</span>, BULK_BUF_SIZE);</div>
345
<div class="line">        <span class="keywordflow">goto</span> err;</div>
346
<div class="line">    }</div>
347
<div class="line"></div>
348
<div class="line"><span class="comment">// verify mode and prepare device if necessary</span></div>
349
<div class="line">    <span class="keywordflow">if</span> ( <a class="code" href="ztex_8h.html#a4f0de67505fd5f34a15dc14cecf9d44f">ztex_default_gpio_ctl</a>(handle,0,0) ) {</div>
350
<div class="line">        fprintf(stderr,<span class="stringliteral">&quot;Warning: wrong initial mode, switching to mode 0\n&quot;</span>);</div>
351
<div class="line">        <a class="code" href="ztex_8h.html#a4f0de67505fd5f34a15dc14cecf9d44f">ztex_default_gpio_ctl</a>(handle,7,0);</div>
352
<div class="line">        <a class="code" href="ztex_8h.html#a42bfe7c8c78b72c747531c370003edb9">ztex_default_reset</a>(handle,0);</div>
353
<div class="line">        libusb_bulk_transfer(handle, info.<a class="code" href="structztex__device__info.html#a02781851eb020d49d6a330b3675359b2">default_in_ep</a>, mbuf, BULK_BUF_SIZE, &amp;transferred, 250);</div>
354
<div class="line">    } <span class="keywordflow">else</span> {</div>
355
<div class="line">        status = libusb_bulk_transfer(handle, info.<a class="code" href="structztex__device__info.html#a02781851eb020d49d6a330b3675359b2">default_in_ep</a>, mbuf, BULK_BUF_SIZE, &amp;transferred, 250);</div>
356
<div class="line">        <span class="keywordflow">if</span> ( (status&gt;=0) &amp;&amp; (transferred&gt;0) ) fprintf(stderr,<span class="stringliteral">&quot;Warning: found %d bytes in EZ-USB FIFO\n&quot;</span>, transferred);</div>
357
<div class="line">    }</div>
358
<div class="line">    fflush(stderr);</div>
359
<div class="line"></div>
360
<div class="line"><span class="comment">// test 1: read-write test (mode 0)</span></div>
361
<div class="line">    <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i=0; i&lt;RW_SIZE; i+=2) {</div>
362
<div class="line">        mbuf[i] = (i&gt;&gt;1) &amp; 127;</div>
363
<div class="line">        mbuf[i+1] = 128 | ((i &gt;&gt; 8 ) &amp; 127);</div>
364
<div class="line">    }</div>
365
<div class="line">    TWO_TRIES(status, libusb_bulk_transfer(handle, info.<a class="code" href="structztex__device__info.html#a0c09328b8b81a94f007f171bbcd6ad52">default_out_ep</a>, mbuf, RW_SIZE, &amp;transferred, 2000));</div>
366
<div class="line">    <span class="keywordflow">if</span> ( status &lt; 0 ) {</div>
367
<div class="line">        fprintf(stderr,<span class="stringliteral">&quot;Bulk write error: %s\n&quot;</span>, libusb_error_name(status));</div>
368
<div class="line">        <span class="keywordflow">goto</span> err;</div>
369
<div class="line">    }</div>
370
<div class="line">    printf(<span class="stringliteral">&quot;Read-write test, short packet test: wrote %d Bytes\n&quot;</span>, transferred);</div>
371
<div class="line">    fflush(stdout);</div>
372
<div class="line">    </div>
373
<div class="line">    TWO_TRIES(status, libusb_bulk_transfer(handle, info.<a class="code" href="structztex__device__info.html#a02781851eb020d49d6a330b3675359b2">default_in_ep</a>, mbuf, BULK_BUF_SIZE, &amp;transferred, 4000));</div>
374
<div class="line">    <span class="keywordflow">if</span> ( status &lt; 0 ) {</div>
375
<div class="line">        fprintf(stderr,<span class="stringliteral">&quot;Bulk read error: %s\n&quot;</span>, libusb_error_name(status));</div>
376
<div class="line">        <span class="keywordflow">goto</span> err;</div>
377
<div class="line">    }</div>
378
<div class="line">    {</div>
379
<div class="line">        <span class="keywordtype">int</span> i=mbuf[0]&gt;&gt;7;</div>
380
<div class="line">        <span class="keywordtype">int</span> j=mbuf[i] | ((mbuf[i+1] &amp; 127)&lt;&lt;7);</div>
381
<div class="line">        printf(<span class="stringliteral">&quot;Read-write test: read (%d=%d*512+%d) Bytes.  %d leading Bytes lost&quot;</span>, transferred, transferred/512, transferred&amp;511, j*2  );</div>
382
<div class="line">        <span class="keywordflow">if</span> ( j ) printf(<span class="stringliteral">&quot;(This may be platform specific)&quot;</span> );</div>
383
<div class="line">        size = 0;</div>
384
<div class="line">        <span class="keywordflow">for</span> (i=i+2; i+1&lt;transferred; i+=2) {</div>
385
<div class="line">            <span class="keywordtype">int</span> k = mbuf[i] | ((mbuf[i+1] &amp; 127)&lt;&lt;7);</div>
386
<div class="line">            <span class="keywordflow">if</span> ( k != ((j+1) &amp; 0x3fff) ) size +=1;</div>
387
<div class="line">            j=k;</div>
388
<div class="line">        }</div>
389
<div class="line">        printf(<span class="stringliteral">&quot;. %d data errors.  %d Bytes remaining in FIFO due to memory transfer granularity\n&quot;</span>, size, RW_SIZE-transferred);</div>
390
<div class="line">        fflush(stdout);</div>
391
<div class="line">    }</div>
392
<div class="line"></div>
393
<div class="line"><span class="comment">// test 2: read rate test using test data generator (mode 1)</span></div>
394
<div class="line">    <span class="comment">// reset application and set mode 1</span></div>
395
<div class="line">    <a class="code" href="ztex_8h.html#a42bfe7c8c78b72c747531c370003edb9">ztex_default_reset</a>(handle,0);</div>
396
<div class="line">    status = <a class="code" href="ztex_8h.html#a4f0de67505fd5f34a15dc14cecf9d44f">ztex_default_gpio_ctl</a>(handle,7,1);</div>
397
<div class="line">    <span class="keywordflow">if</span> ( status &lt; 0 ) {</div>
398
<div class="line">        fprintf(stderr,<span class="stringliteral">&quot;Error setting GPIO&#39;s: %s\n&quot;</span>, libusb_error_name(status));</div>
399
<div class="line">        <span class="keywordflow">goto</span> err;</div>
400
<div class="line">    }</div>
401
<div class="line"></div>
402
<div class="line">    <span class="comment">// read data and measure time, first packets are ignored because EZ-USB buffer may be filled</span></div>
403
<div class="line">    printf(<span class="stringliteral">&quot;Measuring read rate using libusb_bulk_transfer ... \n&quot;</span>);</div>
404
<div class="line">    fflush(stdout);</div>
405
<div class="line">    size=0;</div>
406
<div class="line">    <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i=0; i&lt;55; i++) {</div>
407
<div class="line">        <span class="keywordflow">if</span> ( i==5 ) gettimeofday(&amp;tv1, NULL);</div>
408
<div class="line">        TWO_TRIES( status, libusb_bulk_transfer(handle, info.<a class="code" href="structztex__device__info.html#a02781851eb020d49d6a330b3675359b2">default_in_ep</a>, mbuf, BULK_BUF_SIZE, &amp;transferred, 2000));</div>
409
<div class="line">        <span class="keywordflow">if</span> ( status &lt; 0 ) {</div>
410
<div class="line">            fprintf(stderr,<span class="stringliteral">&quot;Bulk read error: %s\n&quot;</span>, libusb_error_name(status));</div>
411
<div class="line">            <span class="keywordflow">goto</span> err;</div>
412
<div class="line">        }</div>
413
<div class="line">        <span class="keywordflow">if</span> ( (i==0) &amp;&amp; ( (mbuf[0]!=0) &amp;&amp; (mbuf[1]!=239) ) ) {</div>
414
<div class="line">            fprintf(stderr,<span class="stringliteral">&quot;Warning: Invalid start of data: %d %d, leading data may went lost\n&quot;</span>,mbuf[0], mbuf[1]);</div>
415
<div class="line">        }</div>
416
<div class="line">        <span class="keywordflow">if</span> ( i&gt;=5 ) size+=transferred;</div>
417
<div class="line">    }</div>
418
<div class="line">    gettimeofday(&amp;tv2, NULL);</div>
419
<div class="line">    printf(<span class="stringliteral">&quot;Read %.1f MB at %.1f MB/s\n&quot;</span>, size/(1024.0*1024.0), size/( (tv2.tv_sec-tv1.tv_sec)*1e6 + (tv2.tv_usec-tv1.tv_usec) )); </div>
420
<div class="line">    fflush(stdout);</div>
421
<div class="line"></div>
422
<div class="line">    <span class="comment">// release resources</span></div>
423
<div class="line">    status = 0;</div>
424
<div class="line">    <span class="keywordflow">goto</span> noerr;</div>
425
<div class="line">err:</div>
426
<div class="line">    status = 1;</div>
427
<div class="line">noerr:</div>
428
<div class="line">    <span class="keywordflow">if</span> ( mbuf ) free(mbuf);</div>
429
<div class="line">    <span class="keywordflow">if</span> ( bitstream_fn ) free(bitstream_fn);</div>
430
<div class="line">    <span class="keywordflow">if</span> ( handle ) {</div>
431
<div class="line">        libusb_release_interface(handle,0);</div>
432
<div class="line">        libusb_close(handle);</div>
433
<div class="line">    }</div>
434
<div class="line">    <span class="keywordflow">if</span> ( devs ) libusb_free_device_list(devs, 1);</div>
435
<div class="line">    libusb_exit(NULL);</div>
436
<div class="line"><span class="preprocessor">#if defined(WIN32) || defined(_WIN32) || defined(WIN64) || defined(_WIN64)</span></div>
437
<div class="line">    printf(<span class="stringliteral">&quot;Press &lt;return&gt; to quit\n&quot;</span>);</div>
438
<div class="line">    fflush(NULL);</div>
439
<div class="line">    fgetc(stdin);</div>
440
<div class="line"><span class="preprocessor">#endif    </span></div>
441
<div class="line">    <span class="keywordflow">return</span> status;</div>
442
<div class="line">}</div>
443
</div><!-- fragment --> </div></div><!-- contents -->
444
</div><!-- doc-content -->
445
<!-- start footer part -->
446
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
447
  <ul>
448
    <li class="navelem"><a class="el" href="dir_0f883cfafa81589f73fbd50f77c9be78.html">capi</a></li><li class="navelem"><a class="el" href="dir_811541c6271c17b41af027698e62c386.html">c</a></li><li class="navelem"><a class="el" href="memfifo_8c.html">memfifo.c</a></li>
449
    <li class="footer">Generated on Wed Mar 22 2017 19:03:08 for ZTEX core API for C by
450
    <a href="http://www.doxygen.org/index.html">
451
    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.8 </li>
452
  </ul>
453
</div>
454
</body>
455
</html>

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.