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 Page</span></a></li>
|
48 |
|
|
<li><a href="annotated.html"><span>Data 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 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"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Data Structures</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark"> </span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark"> </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 <stdio.h></span></div>
|
135 |
|
|
<div class="line"><span class="preprocessor">#include <stdarg.h></span></div>
|
136 |
|
|
<div class="line"><span class="preprocessor">#include <stdlib.h></span></div>
|
137 |
|
|
<div class="line"><span class="preprocessor">#include <string.h></span></div>
|
138 |
|
|
<div class="line"><span class="preprocessor">#include <fcntl.h></span></div>
|
139 |
|
|
<div class="line"><span class="preprocessor">#include <sys/types.h></span></div>
|
140 |
|
|
<div class="line"><span class="preprocessor">#include <sys/time.h></span></div>
|
141 |
|
|
<div class="line"><span class="preprocessor">#include <libusb-1.0/libusb.h></span></div>
|
142 |
|
|
<div class="line"></div>
|
143 |
|
|
<div class="line"><span class="preprocessor">#include "<a class="code" href="ztex_8h.html">ztex.h</a>"</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">"Usage: %s options\n"</span>,prog_name);</div>
|
153 |
|
|
<div class="line"> fprintf(stderr, <span class="stringliteral">" -h Display this usage information\n"</span></div>
|
154 |
|
|
<div class="line"> <span class="stringliteral">" -fu <vendor ID>:<product ID> Select device by USB IDs, default: 0x221A:0x100, <0:ignore ID\n"</span></div>
|
155 |
|
|
<div class="line"> <span class="stringliteral">" -fd <bus>:<device> Select device by bus number and device address\n"</span></div>
|
156 |
|
|
<div class="line"> <span class="stringliteral">" -fs <string> Select device by serial number string\n"</span></div>
|
157 |
|
|
<div class="line"> <span class="stringliteral">" -fp <string> Select device by product string\n"</span></div>
|
158 |
|
|
<div class="line"> <span class="stringliteral">" -s <path> Additional search path for bitstream, default '.."</span>DIRSEP<span class="stringliteral">".."</span>DIRSEP<span class="stringliteral">"examples"</span>DIRSEP<span class="stringliteral">"memfifo'\n"</span></div>
|
159 |
|
|
<div class="line"> <span class="stringliteral">" -r Reset device (default: reset configuration only)\n"</span></div>
|
160 |
|
|
<div class="line"> <span class="stringliteral">" -i Print device info\n"</span></div>
|
161 |
|
|
<div class="line"> <span class="stringliteral">" -p Print matching USB devices\n"</span></div>
|
162 |
|
|
<div class="line"> <span class="stringliteral">" -pa Print all USB devices\n"</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<argc; i++) {</div>
|
194 |
|
|
<div class="line"> <span class="keywordflow">if</span> ( !strcmp(argv[i],<span class="stringliteral">"-h"</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">"-p"</span>) ) print=1;</div>
|
196 |
|
|
<div class="line"> <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( !strcmp(argv[i],<span class="stringliteral">"-pa"</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">"-i"</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">"-r"</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">"-fu"</span>) ) {</div>
|
200 |
|
|
<div class="line"> i++;</div>
|
201 |
|
|
<div class="line"> <span class="keywordflow">if</span> (i>=argc || sscanf(argv[i],<span class="stringliteral">"%i:%i"</span>, &id_vendor, &id_product)!=2 ) <span class="keywordflow">return</span> paramerr(<span class="stringliteral">"Error: <vendor ID>:<product ID> expected after -fu\n"</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">"-fd"</span>) ) {</div>
|
204 |
|
|
<div class="line"> i++;</div>
|
205 |
|
|
<div class="line"> <span class="keywordflow">if</span> (i>=argc || sscanf(argv[i],<span class="stringliteral">"%i:%i"</span>, &busnum, &devnum)!=2 ) <span class="keywordflow">return</span> paramerr(<span class="stringliteral">"Error: <bus>:<device> expected after -fd\n"</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">"-fs"</span>) ) {</div>
|
208 |
|
|
<div class="line"> i++;</div>
|
209 |
|
|
<div class="line"> <span class="keywordflow">if</span> (i>=argc ) <span class="keywordflow">return</span> paramerr(<span class="stringliteral">"Error: <string> expected after -fs\n"</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">"-fp"</span>) ) {</div>
|
213 |
|
|
<div class="line"> i++;</div>
|
214 |
|
|
<div class="line"> <span class="keywordflow">if</span> (i>=argc ) <span class="keywordflow">return</span> paramerr(<span class="stringliteral">"Error: <string> expected after -fp\n"</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">"-s"</span>) ) {</div>
|
218 |
|
|
<div class="line"> i++;</div>
|
219 |
|
|
<div class="line"> <span class="keywordflow">if</span> (i>=argc ) <span class="keywordflow">return</span> paramerr(<span class="stringliteral">"Error: <path> expected after -s\n"</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">"Error: Invalid parameter %s\n"</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 < 0) {</div>
|
229 |
|
|
<div class="line"> fprintf(stderr,<span class="stringliteral">"Error: Unable to init libusb: %s\n"</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, &devs);</div>
|
235 |
|
|
<div class="line"> <span class="keywordflow">if</span> (status < 0) {</div>
|
236 |
|
|
<div class="line"> fprintf(stderr,<span class="stringliteral">"Error: Unable to get device list: %s\n"</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<0 ) {</div>
|
248 |
|
|
<div class="line"> <span class="keywordflow">if</span> (dev_idx==-1) fprintf(stderr,<span class="stringliteral">"Error: No device found\n"</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], &handle);</div>
|
254 |
|
|
<div class="line"> <span class="keywordflow">if</span> (status < 0) {</div>
|
255 |
|
|
<div class="line"> fprintf(stderr,<span class="stringliteral">"Error: Unable to open device: %s\n"</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 < 0) {</div>
|
265 |
|
|
<div class="line"> fprintf(stderr,<span class="stringliteral">"Warning: Unable to unconfigure device: %s, trying to reset it\n"</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">"Due to limitations of Windows neither this nor device reset works. This may cause further errors ...\n"</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 < 0) {</div>
|
275 |
|
|
<div class="line"> fprintf(stderr,<span class="stringliteral">"Error: Unable to reset device: %s\n"</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 < 0) fprintf(stderr,<span class="stringliteral">"Warning: Unable to set configuration 1: %s\n"</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, &info);</div>
|
285 |
|
|
<div class="line"> <span class="keywordflow">if</span> ( status < 0 ) {</div>
|
286 |
|
|
<div class="line"> fprintf(stderr,<span class="stringliteral">"Error: Unable to get device info: %s\n"</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), &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 < 0 ) {</div>
|
294 |
|
|
<div class="line"> fprintf(stderr,<span class="stringliteral">"Error: Unable to get FPGA configuration state: %s\n"</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">"FPGA: %s\n"</span>, status==0 ? <span class="stringliteral">"unconfigured"</span> : <span class="stringliteral">"configured"</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>( &info, bitstream_path ? bitstream_path : <span class="stringliteral">".."</span>DIRSEP<span class="stringliteral">".."</span>DIRSEP<span class="stringliteral">"examples"</span>DIRSEP<span class="stringliteral">"memfifo"</span> , <span class="stringliteral">"memfifo"</span>);</div>
|
304 |
|
|
<div class="line"> <span class="keywordflow">if</span> ( bitstream_fn ) {</div>
|
305 |
|
|
<div class="line"> printf(<span class="stringliteral">"Using bitstream '%s'\n"</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">"Warning: Bitstream not found\n"</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">"rb"</span>);</div>
|
315 |
|
|
<div class="line"> <span class="keywordflow">if</span> ( fd == NULL ) {</div>
|
316 |
|
|
<div class="line"> fprintf(stderr,<span class="stringliteral">"Warning: Error opening file '%s'\n"</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,&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 < 0 ) {</div>
|
328 |
|
|
<div class="line"> fprintf(stderr,<span class="stringliteral">"Error: Unable to get FPGA configuration state: %s\n"</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">"Error: FPGA not configured\n"</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 < 0 ) {</div>
|
338 |
|
|
<div class="line"> fprintf(stderr,<span class="stringliteral">"Error claiming interface 0: %s\n"</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">"Error allocating %d bytes\n"</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">"Warning: wrong initial mode, switching to mode 0\n"</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, &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, &transferred, 250);</div>
|
356 |
|
|
<div class="line"> <span class="keywordflow">if</span> ( (status>=0) && (transferred>0) ) fprintf(stderr,<span class="stringliteral">"Warning: found %d bytes in EZ-USB FIFO\n"</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<RW_SIZE; i+=2) {</div>
|
362 |
|
|
<div class="line"> mbuf[i] = (i>>1) & 127;</div>
|
363 |
|
|
<div class="line"> mbuf[i+1] = 128 | ((i >> 8 ) & 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, &transferred, 2000));</div>
|
366 |
|
|
<div class="line"> <span class="keywordflow">if</span> ( status < 0 ) {</div>
|
367 |
|
|
<div class="line"> fprintf(stderr,<span class="stringliteral">"Bulk write error: %s\n"</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">"Read-write test, short packet test: wrote %d Bytes\n"</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, &transferred, 4000));</div>
|
374 |
|
|
<div class="line"> <span class="keywordflow">if</span> ( status < 0 ) {</div>
|
375 |
|
|
<div class="line"> fprintf(stderr,<span class="stringliteral">"Bulk read error: %s\n"</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]>>7;</div>
|
380 |
|
|
<div class="line"> <span class="keywordtype">int</span> j=mbuf[i] | ((mbuf[i+1] & 127)<<7);</div>
|
381 |
|
|
<div class="line"> printf(<span class="stringliteral">"Read-write test: read (%d=%d*512+%d) Bytes. %d leading Bytes lost"</span>, transferred, transferred/512, transferred&511, j*2 );</div>
|
382 |
|
|
<div class="line"> <span class="keywordflow">if</span> ( j ) printf(<span class="stringliteral">"(This may be platform specific)"</span> );</div>
|
383 |
|
|
<div class="line"> size = 0;</div>
|
384 |
|
|
<div class="line"> <span class="keywordflow">for</span> (i=i+2; i+1<transferred; i+=2) {</div>
|
385 |
|
|
<div class="line"> <span class="keywordtype">int</span> k = mbuf[i] | ((mbuf[i+1] & 127)<<7);</div>
|
386 |
|
|
<div class="line"> <span class="keywordflow">if</span> ( k != ((j+1) & 0x3fff) ) size +=1;</div>
|
387 |
|
|
<div class="line"> j=k;</div>
|
388 |
|
|
<div class="line"> }</div>
|
389 |
|
|
<div class="line"> printf(<span class="stringliteral">". %d data errors. %d Bytes remaining in FIFO due to memory transfer granularity\n"</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 < 0 ) {</div>
|
398 |
|
|
<div class="line"> fprintf(stderr,<span class="stringliteral">"Error setting GPIO's: %s\n"</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">"Measuring read rate using libusb_bulk_transfer ... \n"</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<55; i++) {</div>
|
407 |
|
|
<div class="line"> <span class="keywordflow">if</span> ( i==5 ) gettimeofday(&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, &transferred, 2000));</div>
|
409 |
|
|
<div class="line"> <span class="keywordflow">if</span> ( status < 0 ) {</div>
|
410 |
|
|
<div class="line"> fprintf(stderr,<span class="stringliteral">"Bulk read error: %s\n"</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) && ( (mbuf[0]!=0) && (mbuf[1]!=239) ) ) {</div>
|
414 |
|
|
<div class="line"> fprintf(stderr,<span class="stringliteral">"Warning: Invalid start of data: %d %d, leading data may went lost\n"</span>,mbuf[0], mbuf[1]);</div>
|
415 |
|
|
<div class="line"> }</div>
|
416 |
|
|
<div class="line"> <span class="keywordflow">if</span> ( i>=5 ) size+=transferred;</div>
|
417 |
|
|
<div class="line"> }</div>
|
418 |
|
|
<div class="line"> gettimeofday(&tv2, NULL);</div>
|
419 |
|
|
<div class="line"> printf(<span class="stringliteral">"Read %.1f MB at %.1f MB/s\n"</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">"Press <return> to quit\n"</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>
|