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] - Rev 2
Compare with Previous | Blame | View Log
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <meta http-equiv="X-UA-Compatible" content="IE=9"/> <meta name="generator" content="Doxygen 1.8.8"/> <title>ZTEX core API for C: memfifo.c File Reference</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> <script type="text/javascript" src="jquery.js"></script> <script type="text/javascript" src="dynsections.js"></script> <link href="navtree.css" rel="stylesheet" type="text/css"/> <script type="text/javascript" src="resize.js"></script> <script type="text/javascript" src="navtree.js"></script> <script type="text/javascript"> $(document).ready(initResizable); $(window).load(resizeHeight); </script> <link href="search/search.css" rel="stylesheet" type="text/css"/> <script type="text/javascript" src="search/search.js"></script> <script type="text/javascript"> $(document).ready(function() { searchBox.OnSelectItem(0); }); </script> <link href="doxygen.css" rel="stylesheet" type="text/css" /> </head> <body> <div id="top"><!-- do not remove this div, it is closed by doxygen! --> <div id="titlearea"> <table cellspacing="0" cellpadding="0"> <tbody> <tr style="height: 56px;"> <td style="padding-left: 0.5em;"> <div id="projectname">ZTEX core API for C </div> <div id="projectbrief">Host software API for ZTEX FPGA Boards for C</div> </td> </tr> </tbody> </table> </div> <!-- end header part --> <!-- Generated by Doxygen 1.8.8 --> <script type="text/javascript"> var searchBox = new SearchBox("searchBox", "search",false,'Search'); </script> <div id="navrow1" class="tabs"> <ul class="tablist"> <li><a href="index.html"><span>Main Page</span></a></li> <li><a href="annotated.html"><span>Data Structures</span></a></li> <li class="current"><a href="files.html"><span>Files</span></a></li> <li> <div id="MSearchBox" class="MSearchBoxInactive"> <span class="left"> <img id="MSearchSelect" src="search/mag_sel.png" onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" alt=""/> <input type="text" id="MSearchField" value="Search" accesskey="S" onfocus="searchBox.OnSearchFieldFocus(true)" onblur="searchBox.OnSearchFieldFocus(false)" onkeyup="searchBox.OnSearchFieldChange(event)"/> </span><span class="right"> <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a> </span> </div> </li> </ul> </div> <div id="navrow2" class="tabs2"> <ul class="tablist"> <li><a href="files.html"><span>File List</span></a></li> <li><a href="globals.html"><span>Globals</span></a></li> </ul> </div> </div><!-- top --> <div id="side-nav" class="ui-resizable side-nav-resizable"> <div id="nav-tree"> <div id="nav-tree-contents"> <div id="nav-sync" class="sync"></div> </div> </div> <div id="splitbar" style="-moz-user-select:none;" class="ui-resizable-handle"> </div> </div> <script type="text/javascript"> $(document).ready(function(){initNavTree('memfifo_8c.html','');}); </script> <div id="doc-content"> <!-- window showing the filter options --> <div id="MSearchSelectWindow" onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> <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> <!-- iframe showing the search results (closed by default) --> <div id="MSearchResultsWindow"> <iframe src="javascript:void(0)" frameborder="0" name="MSearchResults" id="MSearchResults"> </iframe> </div> <div class="header"> <div class="headertitle"> <div class="title">memfifo.c File Reference</div> </div> </div><!--header--> <div class="contents"> <p>memfifo example for C. <a href="#details">More...</a></p> <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2> <div class="textblock"><p>memfifo example for C. </p> <p>This example demonstrates the usage of the C API and the high speed interface of the default firmware.</p> <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> <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> <p>Full list of options can be obtained with '-h' </p><div class="fragment"><div class="line"><span class="comment">/*#</span></div> <div class="line"><span class="comment"> ZTEX Core API for C with examples</span></div> <div class="line"><span class="comment"> Copyright (C) 2009-2017 ZTEX GmbH.</span></div> <div class="line"><span class="comment"> http://www.ztex.de</span></div> <div class="line"><span class="comment"></span></div> <div class="line"><span class="comment"> This program is free software; you can redistribute it and/or modify</span></div> <div class="line"><span class="comment"> it under the terms of the GNU General Public License version 3 as</span></div> <div class="line"><span class="comment"> published by the Free Software Foundation.</span></div> <div class="line"><span class="comment"></span></div> <div class="line"><span class="comment"> This program is distributed in the hope that it will be useful, but</span></div> <div class="line"><span class="comment"> WITHOUT ANY WARRANTY; without even the implied warranty of</span></div> <div class="line"><span class="comment"> MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU</span></div> <div class="line"><span class="comment"> General Public License for more details.</span></div> <div class="line"><span class="comment"></span></div> <div class="line"><span class="comment"> You should have received a copy of the GNU General Public License</span></div> <div class="line"><span class="comment"> along with this program; if not, see http://www.gnu.org/licenses/.</span></div> <div class="line"><span class="comment">#*/</span></div> <div class="line"></div> <div class="line"><span class="preprocessor">#include <stdio.h></span></div> <div class="line"><span class="preprocessor">#include <stdarg.h></span></div> <div class="line"><span class="preprocessor">#include <stdlib.h></span></div> <div class="line"><span class="preprocessor">#include <string.h></span></div> <div class="line"><span class="preprocessor">#include <fcntl.h></span></div> <div class="line"><span class="preprocessor">#include <sys/types.h></span></div> <div class="line"><span class="preprocessor">#include <sys/time.h></span></div> <div class="line"><span class="preprocessor">#include <libusb-1.0/libusb.h></span></div> <div class="line"></div> <div class="line"><span class="preprocessor">#include "<a class="code" href="ztex_8h.html">ztex.h</a>"</span></div> <div class="line"></div> <div class="line"><span class="preprocessor">#define BULK_BUF_SIZE 4*1024*1024</span></div> <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> <div class="line"></div> <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> <div class="line"></div> <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> <div class="line">{</div> <div class="line"> fprintf(stderr, <span class="stringliteral">"Usage: %s options\n"</span>,prog_name);</div> <div class="line"> fprintf(stderr, <span class="stringliteral">" -h Display this usage information\n"</span></div> <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> <div class="line"> <span class="stringliteral">" -fd <bus>:<device> Select device by bus number and device address\n"</span></div> <div class="line"> <span class="stringliteral">" -fs <string> Select device by serial number string\n"</span></div> <div class="line"> <span class="stringliteral">" -fp <string> Select device by product string\n"</span></div> <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> <div class="line"> <span class="stringliteral">" -r Reset device (default: reset configuration only)\n"</span></div> <div class="line"> <span class="stringliteral">" -i Print device info\n"</span></div> <div class="line"> <span class="stringliteral">" -p Print matching USB devices\n"</span></div> <div class="line"> <span class="stringliteral">" -pa Print all USB devices\n"</span></div> <div class="line"> );</div> <div class="line"> <span class="keywordflow">if</span> ( format ) {</div> <div class="line"> va_list args;</div> <div class="line"> va_start(args,format);</div> <div class="line"> vfprintf(stderr, format, args);</div> <div class="line"> va_end(args);</div> <div class="line"> <span class="keywordflow">return</span> 1;</div> <div class="line"> }</div> <div class="line"> <span class="keywordflow">return</span> 0;</div> <div class="line">}</div> <div class="line"></div> <div class="line"><span class="keywordtype">int</span> main(<span class="keywordtype">int</span> argc, <span class="keywordtype">char</span> **argv)</div> <div class="line">{</div> <div class="line"> <span class="keywordtype">int</span> id_vendor = 0x221A; <span class="comment">// ZTEX vendor ID</span></div> <div class="line"> <span class="keywordtype">int</span> id_product = 0x100; <span class="comment">// default product ID for ZTEX firmware</span></div> <div class="line"> <span class="keywordtype">int</span> status = 0;</div> <div class="line"> libusb_device **devs = NULL;</div> <div class="line"> <span class="keywordtype">int</span> print_all=0, print=0, print_info=0, reset_dev=0;</div> <div class="line"> <span class="keywordtype">int</span> busnum = -1, devnum = -1;</div> <div class="line"> <span class="keywordtype">char</span> *sn_string = NULL, *product_string = NULL;</div> <div class="line"> libusb_device_handle *handle = NULL;</div> <div class="line"> <a class="code" href="structztex__device__info.html">ztex_device_info</a> info;</div> <div class="line"> <span class="keywordtype">char</span> *bitstream_fn = NULL, *bitstream_path = NULL;</div> <div class="line"> <span class="keywordtype">char</span> sbuf[8192];</div> <div class="line"> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *mbuf = NULL;</div> <div class="line"> <span class="keywordtype">int</span> transferred, size;</div> <div class="line"> <span class="keyword">struct </span>timeval tv1,tv2;</div> <div class="line"></div> <div class="line"> <span class="comment">// process parameters</span></div> <div class="line"> prog_name = argv[0];</div> <div class="line"> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i=1; i<argc; i++) {</div> <div class="line"> <span class="keywordflow">if</span> ( !strcmp(argv[i],<span class="stringliteral">"-h"</span>) ) <span class="keywordflow">return</span> paramerr(NULL);</div> <div class="line"> <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( !strcmp(argv[i],<span class="stringliteral">"-p"</span>) ) print=1;</div> <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> <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> <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> <div class="line"> <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( !strcmp(argv[i],<span class="stringliteral">"-fu"</span>) ) {</div> <div class="line"> i++;</div> <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> <div class="line"> }</div> <div class="line"> <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( !strcmp(argv[i],<span class="stringliteral">"-fd"</span>) ) {</div> <div class="line"> i++;</div> <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> <div class="line"> }</div> <div class="line"> <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( !strcmp(argv[i],<span class="stringliteral">"-fs"</span>) ) {</div> <div class="line"> i++;</div> <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> <div class="line"> sn_string = argv[i];</div> <div class="line"> }</div> <div class="line"> <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( !strcmp(argv[i],<span class="stringliteral">"-fp"</span>) ) {</div> <div class="line"> i++;</div> <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> <div class="line"> product_string = argv[i];</div> <div class="line"> }</div> <div class="line"> <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( !strcmp(argv[i],<span class="stringliteral">"-s"</span>) ) {</div> <div class="line"> i++;</div> <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> <div class="line"> bitstream_path = argv[i];</div> <div class="line"> }</div> <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> <div class="line"> }</div> <div class="line"> </div> <div class="line"> </div> <div class="line"> <span class="comment">// INIT libusb</span></div> <div class="line"> status = libusb_init(NULL);</div> <div class="line"> <span class="keywordflow">if</span> (status < 0) {</div> <div class="line"> fprintf(stderr,<span class="stringliteral">"Error: Unable to init libusb: %s\n"</span>, libusb_error_name(status));</div> <div class="line"> <span class="keywordflow">return</span> 1;</div> <div class="line"> }</div> <div class="line"></div> <div class="line"> <span class="comment">// find all USB devices</span></div> <div class="line"> status = libusb_get_device_list(NULL, &devs);</div> <div class="line"> <span class="keywordflow">if</span> (status < 0) {</div> <div class="line"> fprintf(stderr,<span class="stringliteral">"Error: Unable to get device list: %s\n"</span>, libusb_error_name(status));</div> <div class="line"> <span class="keywordflow">goto</span> err;</div> <div class="line"> }</div> <div class="line"> </div> <div class="line"> <span class="comment">// print bus info or find device</span></div> <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> <div class="line"> printf(sbuf);</div> <div class="line"> fflush(stdout);</div> <div class="line"> <span class="keywordflow">if</span> ( print || print_all ) {</div> <div class="line"> status = 0;</div> <div class="line"> <span class="keywordflow">goto</span> noerr;</div> <div class="line"> } <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( dev_idx<0 ) {</div> <div class="line"> <span class="keywordflow">if</span> (dev_idx==-1) fprintf(stderr,<span class="stringliteral">"Error: No device found\n"</span>);</div> <div class="line"> <span class="keywordflow">goto</span> err;</div> <div class="line"> }</div> <div class="line"></div> <div class="line"> <span class="comment">// open device</span></div> <div class="line"> status = libusb_open(devs[dev_idx], &handle);</div> <div class="line"> <span class="keywordflow">if</span> (status < 0) {</div> <div class="line"> fprintf(stderr,<span class="stringliteral">"Error: Unable to open device: %s\n"</span>, libusb_error_name(status));</div> <div class="line"> <span class="keywordflow">goto</span> err;</div> <div class="line"> }</div> <div class="line"> libusb_free_device_list(devs, 1);</div> <div class="line"> devs=NULL;</div> <div class="line"> </div> <div class="line"> <span class="comment">// reset configuration or device</span></div> <div class="line"> <span class="keywordflow">if</span> ( ! reset_dev ) {</div> <div class="line"> status = libusb_set_configuration(handle,-1);</div> <div class="line"> <span class="keywordflow">if</span> (status < 0) {</div> <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> <div class="line"><span class="preprocessor">#if defined(WIN32) || defined(_WIN32) || defined(WIN64) || defined(_WIN64)</span></div> <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> <div class="line"><span class="preprocessor">#endif </span></div> <div class="line"> reset_dev = 1;</div> <div class="line"> }</div> <div class="line"> }</div> <div class="line"> <span class="keywordflow">if</span> ( reset_dev ) {</div> <div class="line"> status = libusb_reset_device(handle);</div> <div class="line"> <span class="keywordflow">if</span> (status < 0) {</div> <div class="line"> fprintf(stderr,<span class="stringliteral">"Error: Unable to reset device: %s\n"</span>, libusb_error_name(status));</div> <div class="line"> <span class="keywordflow">goto</span> err;</div> <div class="line"> }</div> <div class="line"> }</div> <div class="line"> status = libusb_set_configuration(handle,1);</div> <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> <div class="line"> fflush(stderr);</div> <div class="line"></div> <div class="line"> <span class="comment">// get and print device info</span></div> <div class="line"> status = <a class="code" href="ztex_8h.html#a28cef9d1e168b782b03579c4a59505d3">ztex_get_device_info</a>(handle, &info);</div> <div class="line"> <span class="keywordflow">if</span> ( status < 0 ) {</div> <div class="line"> fprintf(stderr,<span class="stringliteral">"Error: Unable to get device info: %s\n"</span>, libusb_error_name(status));</div> <div class="line"> <span class="keywordflow">goto</span> err;</div> <div class="line"> }</div> <div class="line"> <span class="keywordflow">if</span> ( print_info ) {</div> <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> <div class="line"> printf(sbuf);</div> <div class="line"> status = <a class="code" href="ztex_8h.html#ae679e66864c90211a3d8b4670a64d497">ztex_get_fpga_config</a>(handle);</div> <div class="line"> <span class="keywordflow">if</span> ( status < 0 ) {</div> <div class="line"> fprintf(stderr,<span class="stringliteral">"Error: Unable to get FPGA configuration state: %s\n"</span>, libusb_error_name(status));</div> <div class="line"> <span class="keywordflow">goto</span> err;</div> <div class="line"> }</div> <div class="line"> printf(<span class="stringliteral">"FPGA: %s\n"</span>, status==0 ? <span class="stringliteral">"unconfigured"</span> : <span class="stringliteral">"configured"</span>);</div> <div class="line"> status = 0;</div> <div class="line"> <span class="keywordflow">goto</span> noerr;</div> <div class="line"> }</div> <div class="line"> </div> <div class="line"> <span class="comment">// find bitstream</span></div> <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> <div class="line"> <span class="keywordflow">if</span> ( bitstream_fn ) {</div> <div class="line"> printf(<span class="stringliteral">"Using bitstream '%s'\n"</span>, bitstream_fn);</div> <div class="line"> fflush(stdout);</div> <div class="line"> }</div> <div class="line"> <span class="keywordflow">else</span> {</div> <div class="line"> fprintf(stderr,<span class="stringliteral">"Warning: Bitstream not found\n"</span>);</div> <div class="line"> <span class="keywordflow">goto</span> nobitstream;</div> <div class="line"> }</div> <div class="line"> </div> <div class="line"> <span class="comment">// read and upload bitstream</span></div> <div class="line"> FILE *fd = fopen(bitstream_fn, <span class="stringliteral">"rb"</span>);</div> <div class="line"> <span class="keywordflow">if</span> ( fd == NULL ) {</div> <div class="line"> fprintf(stderr,<span class="stringliteral">"Warning: Error opening file '%s'\n"</span>, bitstream_fn);</div> <div class="line"> <span class="keywordflow">goto</span> nobitstream;</div> <div class="line"> }</div> <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> <div class="line"> fclose(fd);</div> <div class="line"> fprintf(stderr,sbuf);</div> <div class="line"></div> <div class="line">nobitstream:</div> <div class="line"> fflush(stderr);</div> <div class="line"> <span class="comment">// check config</span></div> <div class="line"> status = <a class="code" href="ztex_8h.html#ae679e66864c90211a3d8b4670a64d497">ztex_get_fpga_config</a>(handle);</div> <div class="line"> <span class="keywordflow">if</span> ( status < 0 ) {</div> <div class="line"> fprintf(stderr,<span class="stringliteral">"Error: Unable to get FPGA configuration state: %s\n"</span>, libusb_error_name(status));</div> <div class="line"> <span class="keywordflow">goto</span> err;</div> <div class="line"> } <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( status == 0 ) {</div> <div class="line"> fprintf(stderr,<span class="stringliteral">"Error: FPGA not configured\n"</span>);</div> <div class="line"> <span class="keywordflow">goto</span> err;</div> <div class="line"> }</div> <div class="line"></div> <div class="line"> <span class="comment">// claim interface</span></div> <div class="line"> status = libusb_claim_interface(handle, 0); </div> <div class="line"> <span class="keywordflow">if</span> ( status < 0 ) {</div> <div class="line"> fprintf(stderr,<span class="stringliteral">"Error claiming interface 0: %s\n"</span>, libusb_error_name(status));</div> <div class="line"> <span class="keywordflow">goto</span> err;</div> <div class="line"> }</div> <div class="line"></div> <div class="line"> mbuf = malloc(BULK_BUF_SIZE);</div> <div class="line"> <span class="keywordflow">if</span> ( !mbuf ) {</div> <div class="line"> fprintf(stderr,<span class="stringliteral">"Error allocating %d bytes\n"</span>, BULK_BUF_SIZE);</div> <div class="line"> <span class="keywordflow">goto</span> err;</div> <div class="line"> }</div> <div class="line"></div> <div class="line"><span class="comment">// verify mode and prepare device if necessary</span></div> <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> <div class="line"> fprintf(stderr,<span class="stringliteral">"Warning: wrong initial mode, switching to mode 0\n"</span>);</div> <div class="line"> <a class="code" href="ztex_8h.html#a4f0de67505fd5f34a15dc14cecf9d44f">ztex_default_gpio_ctl</a>(handle,7,0);</div> <div class="line"> <a class="code" href="ztex_8h.html#a42bfe7c8c78b72c747531c370003edb9">ztex_default_reset</a>(handle,0);</div> <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> <div class="line"> } <span class="keywordflow">else</span> {</div> <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> <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> <div class="line"> }</div> <div class="line"> fflush(stderr);</div> <div class="line"></div> <div class="line"><span class="comment">// test 1: read-write test (mode 0)</span></div> <div class="line"> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i=0; i<RW_SIZE; i+=2) {</div> <div class="line"> mbuf[i] = (i>>1) & 127;</div> <div class="line"> mbuf[i+1] = 128 | ((i >> 8 ) & 127);</div> <div class="line"> }</div> <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> <div class="line"> <span class="keywordflow">if</span> ( status < 0 ) {</div> <div class="line"> fprintf(stderr,<span class="stringliteral">"Bulk write error: %s\n"</span>, libusb_error_name(status));</div> <div class="line"> <span class="keywordflow">goto</span> err;</div> <div class="line"> }</div> <div class="line"> printf(<span class="stringliteral">"Read-write test, short packet test: wrote %d Bytes\n"</span>, transferred);</div> <div class="line"> fflush(stdout);</div> <div class="line"> </div> <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> <div class="line"> <span class="keywordflow">if</span> ( status < 0 ) {</div> <div class="line"> fprintf(stderr,<span class="stringliteral">"Bulk read error: %s\n"</span>, libusb_error_name(status));</div> <div class="line"> <span class="keywordflow">goto</span> err;</div> <div class="line"> }</div> <div class="line"> {</div> <div class="line"> <span class="keywordtype">int</span> i=mbuf[0]>>7;</div> <div class="line"> <span class="keywordtype">int</span> j=mbuf[i] | ((mbuf[i+1] & 127)<<7);</div> <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> <div class="line"> <span class="keywordflow">if</span> ( j ) printf(<span class="stringliteral">"(This may be platform specific)"</span> );</div> <div class="line"> size = 0;</div> <div class="line"> <span class="keywordflow">for</span> (i=i+2; i+1<transferred; i+=2) {</div> <div class="line"> <span class="keywordtype">int</span> k = mbuf[i] | ((mbuf[i+1] & 127)<<7);</div> <div class="line"> <span class="keywordflow">if</span> ( k != ((j+1) & 0x3fff) ) size +=1;</div> <div class="line"> j=k;</div> <div class="line"> }</div> <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> <div class="line"> fflush(stdout);</div> <div class="line"> }</div> <div class="line"></div> <div class="line"><span class="comment">// test 2: read rate test using test data generator (mode 1)</span></div> <div class="line"> <span class="comment">// reset application and set mode 1</span></div> <div class="line"> <a class="code" href="ztex_8h.html#a42bfe7c8c78b72c747531c370003edb9">ztex_default_reset</a>(handle,0);</div> <div class="line"> status = <a class="code" href="ztex_8h.html#a4f0de67505fd5f34a15dc14cecf9d44f">ztex_default_gpio_ctl</a>(handle,7,1);</div> <div class="line"> <span class="keywordflow">if</span> ( status < 0 ) {</div> <div class="line"> fprintf(stderr,<span class="stringliteral">"Error setting GPIO's: %s\n"</span>, libusb_error_name(status));</div> <div class="line"> <span class="keywordflow">goto</span> err;</div> <div class="line"> }</div> <div class="line"></div> <div class="line"> <span class="comment">// read data and measure time, first packets are ignored because EZ-USB buffer may be filled</span></div> <div class="line"> printf(<span class="stringliteral">"Measuring read rate using libusb_bulk_transfer ... \n"</span>);</div> <div class="line"> fflush(stdout);</div> <div class="line"> size=0;</div> <div class="line"> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i=0; i<55; i++) {</div> <div class="line"> <span class="keywordflow">if</span> ( i==5 ) gettimeofday(&tv1, NULL);</div> <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> <div class="line"> <span class="keywordflow">if</span> ( status < 0 ) {</div> <div class="line"> fprintf(stderr,<span class="stringliteral">"Bulk read error: %s\n"</span>, libusb_error_name(status));</div> <div class="line"> <span class="keywordflow">goto</span> err;</div> <div class="line"> }</div> <div class="line"> <span class="keywordflow">if</span> ( (i==0) && ( (mbuf[0]!=0) && (mbuf[1]!=239) ) ) {</div> <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> <div class="line"> }</div> <div class="line"> <span class="keywordflow">if</span> ( i>=5 ) size+=transferred;</div> <div class="line"> }</div> <div class="line"> gettimeofday(&tv2, NULL);</div> <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> <div class="line"> fflush(stdout);</div> <div class="line"></div> <div class="line"> <span class="comment">// release resources</span></div> <div class="line"> status = 0;</div> <div class="line"> <span class="keywordflow">goto</span> noerr;</div> <div class="line">err:</div> <div class="line"> status = 1;</div> <div class="line">noerr:</div> <div class="line"> <span class="keywordflow">if</span> ( mbuf ) free(mbuf);</div> <div class="line"> <span class="keywordflow">if</span> ( bitstream_fn ) free(bitstream_fn);</div> <div class="line"> <span class="keywordflow">if</span> ( handle ) {</div> <div class="line"> libusb_release_interface(handle,0);</div> <div class="line"> libusb_close(handle);</div> <div class="line"> }</div> <div class="line"> <span class="keywordflow">if</span> ( devs ) libusb_free_device_list(devs, 1);</div> <div class="line"> libusb_exit(NULL);</div> <div class="line"><span class="preprocessor">#if defined(WIN32) || defined(_WIN32) || defined(WIN64) || defined(_WIN64)</span></div> <div class="line"> printf(<span class="stringliteral">"Press <return> to quit\n"</span>);</div> <div class="line"> fflush(NULL);</div> <div class="line"> fgetc(stdin);</div> <div class="line"><span class="preprocessor">#endif </span></div> <div class="line"> <span class="keywordflow">return</span> status;</div> <div class="line">}</div> </div><!-- fragment --> </div></div><!-- contents --> </div><!-- doc-content --> <!-- start footer part --> <div id="nav-path" class="navpath"><!-- id is needed for treeview function! --> <ul> <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> <li class="footer">Generated on Wed Mar 22 2017 19:03:08 for ZTEX core API for C by <a href="http://www.doxygen.org/index.html"> <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.8 </li> </ul> </div> </body> </html>