<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://sigrok.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Marcus+Comstedt</id>
	<title>sigrok - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://sigrok.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Marcus+Comstedt"/>
	<link rel="alternate" type="text/html" href="https://sigrok.org/wiki/Special:Contributions/Marcus_Comstedt"/>
	<updated>2026-04-06T14:01:37Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.37.1</generator>
	<entry>
		<id>https://sigrok.org/w/index.php?title=Saleae_Logic16&amp;diff=10866</id>
		<title>Saleae Logic16</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=Saleae_Logic16&amp;diff=10866"/>
		<updated>2015-07-02T13:41:31Z</updated>

		<summary type="html">&lt;p&gt;Marcus Comstedt: /* Hardware */ Add FPGA connections&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox logic analyzer&lt;br /&gt;
| image            = [[File:Saleae Logic16 bottom.png|180px]]&lt;br /&gt;
| name             = Saleae Logic16&lt;br /&gt;
| status           = supported&lt;br /&gt;
| source_code_dir  = saleae-logic16&lt;br /&gt;
| channels         = 3/6/9/16&lt;br /&gt;
| samplerate       = 100/50/32/16MHz&lt;br /&gt;
| samplerate_state = &amp;amp;mdash;&lt;br /&gt;
| triggers         = none (SW-only)&lt;br /&gt;
| voltages         = -0.9V &amp;amp;mdash; 6V&lt;br /&gt;
| threshold        = configurable:&amp;lt;br /&amp;gt;for 1.8V to 3.6V systems: V&amp;lt;sub&amp;gt;IH&amp;lt;/sub&amp;gt;=1.4V, V&amp;lt;sub&amp;gt;IL&amp;lt;/sub&amp;gt;=0.7V&amp;lt;br /&amp;gt;for 5V systems: V&amp;lt;sub&amp;gt;IH&amp;lt;/sub&amp;gt;=3.6V, V&amp;lt;sub&amp;gt;IL&amp;lt;/sub&amp;gt;=1.4V&lt;br /&gt;
| memory           = none&lt;br /&gt;
| compression      = yes&lt;br /&gt;
| website          = [http://www.saleae.com/logic16/ saleae.com]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
The &amp;#039;&amp;#039;&amp;#039;Saleae Logic16&amp;#039;&amp;#039;&amp;#039; is a USB-based, 16-channel logic analyzer with 100/50/32/16MHz sampling rate (at 3/6/9/16 enabled channels). &lt;br /&gt;
&lt;br /&gt;
The case requires a &amp;#039;&amp;#039;&amp;#039;Torx T5&amp;#039;&amp;#039;&amp;#039; screwdriver to open.&lt;br /&gt;
&lt;br /&gt;
See [[Saleae Logic16/Info]] for more details (such as &amp;#039;&amp;#039;&amp;#039;lsusb -vvv&amp;#039;&amp;#039;&amp;#039; output) about the device.&lt;br /&gt;
&lt;br /&gt;
See [[Saleae Logic]] for the predecessor product of the Saleae Logic16. &lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;FPGA&amp;#039;&amp;#039;&amp;#039;: [http://www.xilinx.com/support/index.html/content/xilinx/en/supportNav/silicon_devices/fpga/spartan-3a.html Xilinx Spartan-3A XC3S200A], 200K gates ([http://www.xilinx.com/support/documentation/data_sheets/ds529.pdf datasheeet])&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;USB interface chip&amp;#039;&amp;#039;&amp;#039;: [http://www.cypress.com/?mpn=CY7C68013A-56PVXC Cypress CY7C68013A-56PVXC (FX2LP)] ([http://www.cypress.com/?docID=34060 datasheet])&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ultralow capacitance ESD protection&amp;#039;&amp;#039;&amp;#039;: 4x [http://www.st.com/web/catalog/sense_power/FM114/CL1137/SC1490/PF109008 ST DVIULC6-4SC6] ([http://www.st.com/st-web-ui/static/active/en/resource/technical/document/datasheet/CD00065974.pdf datasheet])&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;2Kbit I2C EEPROM&amp;#039;&amp;#039;&amp;#039;: [http://www.microchip.com/wwwproducts/Devices.aspx?dDocName=en010774 Microchip 24AA02] ([http://ww1.microchip.com/downloads/en/DeviceDoc/21709J.pdf datasheet]) (marking: &amp;quot;B2TH&amp;quot;, starts with &amp;quot;B2&amp;quot; always, the last 2 characters are a &amp;quot;traceability code&amp;quot;)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;2.5MHz, 1.5A synchronous step down switching regulator (1.2V)&amp;#039;&amp;#039;&amp;#039;: [http://www.semtech.com/power-management/switching-regulators/sc189 Semtech SC189] ([http://www.semtech.com/images/datasheet/sc189.pdf datasheet]) (marking: &amp;quot;189C&amp;quot;)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;2.5MHz, 1.5A synchronous step down switching regulator (3.3V)&amp;#039;&amp;#039;&amp;#039;: [http://www.semtech.com/power-management/switching-regulators/sc189 Semtech SC189] ([http://www.semtech.com/images/datasheet/sc189.pdf datasheet]) (marking: &amp;quot;189Z&amp;quot;)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;?&amp;#039;&amp;#039;&amp;#039;: 2x Unknown 3-pin IC. Markings: &amp;quot;72Y7&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pinouts and connections:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;JTAG header (FPGA):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The &amp;#039;&amp;#039;&amp;#039;J3&amp;#039;&amp;#039;&amp;#039; pin header is a JTAG connector wired to the FPGA. The pins are (from left to right, the right-most pin, pin number 1, is square):&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; style=&amp;quot;font-size: smaller&amp;quot; class=&amp;quot;sigroktable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!5&lt;br /&gt;
!4&lt;br /&gt;
!3&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| GND&lt;br /&gt;
| TMS&lt;br /&gt;
| TCK&lt;br /&gt;
| TDO&lt;br /&gt;
| TDI&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Testpoints:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; style=&amp;quot;font-size: smaller&amp;quot; class=&amp;quot;sigroktable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!T1&lt;br /&gt;
!T2&lt;br /&gt;
!T3&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 1.2V&lt;br /&gt;
| 3.3V&lt;br /&gt;
| GND (FX2)&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Cypress FX2:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
{{chip_56pin&lt;br /&gt;
| 1=&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;(FPGA 15, IO_L05P_3)&amp;lt;/span&amp;gt; PD5&lt;br /&gt;
| 2=&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;(FPGA 13, IO_L04N_3)&amp;lt;/span&amp;gt; PD6&lt;br /&gt;
| 3=&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;(FPGA 10, IO_L03N_3)&amp;lt;/span&amp;gt; PD7&lt;br /&gt;
| 4=GND&lt;br /&gt;
| 5=&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;(FPGA 90, IO_0)&amp;lt;/span&amp;gt; CLKOUT&lt;br /&gt;
| 6=VCC&lt;br /&gt;
| 7=GND&lt;br /&gt;
| 8=&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;(FPGA 3, IO_L01P_3)&amp;lt;/span&amp;gt; RDY0/*SLRD&lt;br /&gt;
| 9=&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;(FPGA 16, IO_L05N_3)&amp;lt;/span&amp;gt; RDY1/*SLWR&lt;br /&gt;
| 10=AVCC&lt;br /&gt;
| 11=&amp;lt;span style=&amp;quot;color:brown&amp;quot;&amp;gt;(24MHz crystal)&amp;lt;/span&amp;gt; XTALOUT&lt;br /&gt;
| 12=&amp;lt;span style=&amp;quot;color:brown&amp;quot;&amp;gt;(24MHz crystal)&amp;lt;/span&amp;gt; XTALIN&lt;br /&gt;
| 13=AGND&lt;br /&gt;
| 14=AVCC&lt;br /&gt;
&lt;br /&gt;
| 15=&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;(USB D+)&amp;lt;/span&amp;gt; DPLUS&lt;br /&gt;
| 16=&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;(USB D-)&amp;lt;/span&amp;gt; DMINUS&lt;br /&gt;
| 17=AGND&lt;br /&gt;
| 18=VCC&lt;br /&gt;
| 19=GND&lt;br /&gt;
| 20=&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;(FPGA 84, IO_L02N_0)&amp;lt;/span&amp;gt; *IFCLK&lt;br /&gt;
| 21=RESERVED&lt;br /&gt;
| 22=&amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;(EEPROM SCL)&amp;lt;/span&amp;gt; SCL&lt;br /&gt;
| 23=&amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;(EEPROM SDA)&amp;lt;/span&amp;gt; SDA&lt;br /&gt;
| 24=VCC&lt;br /&gt;
| 25=&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;(FPGA 40, IO_L08P_2)&amp;lt;/span&amp;gt; PB0&lt;br /&gt;
| 26=&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;(FPGA 78, IO_L01N_0)&amp;lt;/span&amp;gt; PB1&lt;br /&gt;
| 27=&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;(FPGA 77, IO_L01P_0)&amp;lt;/span&amp;gt; PB2&lt;br /&gt;
| 28=&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;(FPGA 49, IO_L10N_2)&amp;lt;/span&amp;gt; PB3&lt;br /&gt;
&lt;br /&gt;
| 29=PB4 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;(FPGA 46, MOSI)&amp;lt;/span&amp;gt;&lt;br /&gt;
| 30=PB5 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;(FPGA 41, IO_L08N_2)&amp;lt;/span&amp;gt;&lt;br /&gt;
| 31=PB6 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;(FPGA 37, IO_L07N_2)&amp;lt;/span&amp;gt;&lt;br /&gt;
| 32=PB7 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;(FPGA 93, IO_L05P_0)&amp;lt;/span&amp;gt;&lt;br /&gt;
| 33=GND&lt;br /&gt;
| 34=VCC&lt;br /&gt;
| 35=GND&lt;br /&gt;
| 36=CTL0 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;(FPGA 94, IO_L05N_0)&amp;lt;/span&amp;gt;&lt;br /&gt;
| 37=CTL1 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;(FPGA 97, IP_0)&amp;lt;/span&amp;gt;&lt;br /&gt;
| 38=CTL2 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;(FPGA 100, PROG_B)&amp;lt;/span&amp;gt;&lt;br /&gt;
| 39=VCC&lt;br /&gt;
| 40=PA0 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;(FPGA 54, DONE)&amp;lt;/span&amp;gt;&lt;br /&gt;
| 41=PA1 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;(FPGA 48, INIT_B)&amp;lt;/span&amp;gt;&lt;br /&gt;
| 42=PA2 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;(FPGA 53, CCLK)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
| 43=PA3 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;(FPGA 51, MISO)&amp;lt;/span&amp;gt;&lt;br /&gt;
| 44=PA4 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;(FPGA 98, IO_L06P_0)&amp;lt;/span&amp;gt;&lt;br /&gt;
| 45=PA5 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;(FPGA 85, IO_L03P_0)&amp;lt;/span&amp;gt;&lt;br /&gt;
| 46=PA6 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;(FPGA 30, IO_L04P_2)&amp;lt;/span&amp;gt;&lt;br /&gt;
| 47=PA7 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;(FPGA 9, IO_L03P_3)&amp;lt;/span&amp;gt;&lt;br /&gt;
| 48=GND&lt;br /&gt;
| 49=RESET# &amp;lt;span style=&amp;quot;color:orange&amp;quot;&amp;gt;(3.3V via D2 (diode?))&amp;lt;/span&amp;gt;&lt;br /&gt;
| 50=VCC&lt;br /&gt;
| 51=*WAKEUP &amp;lt;span style=&amp;quot;color:orange&amp;quot;&amp;gt;(3.3V)&amp;lt;/span&amp;gt;&lt;br /&gt;
| 52=PD0 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;(FPGA 6, IO_L02N_3)&amp;lt;/span&amp;gt;&lt;br /&gt;
| 53=PD1 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;(FPGA 4, IO_L01N_3)&amp;lt;/span&amp;gt;&lt;br /&gt;
| 54=PD2 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;(FPGA 5, IO_L02P_3)&amp;lt;/span&amp;gt;&lt;br /&gt;
| 55=PD3 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;(FPGA 44, IO_L09N_2)&amp;lt;/span&amp;gt;&lt;br /&gt;
| 56=PD4 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;(FPGA 12, IO_L04P_3)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Other FPGA connections:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; style=&amp;quot;font-size: smaller&amp;quot; class=&amp;quot;sigroktable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!28&lt;br /&gt;
|CH0&lt;br /&gt;
!52&lt;br /&gt;
|CH8&lt;br /&gt;
|-&lt;br /&gt;
!29&lt;br /&gt;
|CH1&lt;br /&gt;
!56&lt;br /&gt;
|CH9&lt;br /&gt;
|-&lt;br /&gt;
!32&lt;br /&gt;
|CH2&lt;br /&gt;
!57&lt;br /&gt;
|CH10&lt;br /&gt;
|-&lt;br /&gt;
!33&lt;br /&gt;
|CH3&lt;br /&gt;
!60&lt;br /&gt;
|CH11&lt;br /&gt;
|-&lt;br /&gt;
!34&lt;br /&gt;
|CH4&lt;br /&gt;
!61&lt;br /&gt;
|CH12&lt;br /&gt;
|-&lt;br /&gt;
!36&lt;br /&gt;
|CH5&lt;br /&gt;
!62&lt;br /&gt;
|CH13&lt;br /&gt;
|-&lt;br /&gt;
!43&lt;br /&gt;
|CH6&lt;br /&gt;
!64&lt;br /&gt;
|CH14&lt;br /&gt;
|-&lt;br /&gt;
!50&lt;br /&gt;
|CH7&lt;br /&gt;
!65&lt;br /&gt;
|CH15&lt;br /&gt;
|-&lt;br /&gt;
!73&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;|LED (active low)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Photos ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Saleae Logic16.jpg|&amp;lt;small&amp;gt;Device, front&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Saleae Logic16 bottom.jpg|&amp;lt;small&amp;gt;Device, bottom&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Saleae Logic16 PCB top.jpg|&amp;lt;small&amp;gt;PCB, top&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Saleae Logic16 PCB bottom.jpg|&amp;lt;small&amp;gt;PCB, bottom&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Saleae logic16 xilinx xc3s200a.jpg|&amp;lt;small&amp;gt;Xilinx XC3S200A&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Saleae logic16 cypress fx2lp.jpg|&amp;lt;small&amp;gt;Cypress FX2LP&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Saleae logic16 eeprom b2th.jpg|&amp;lt;small&amp;gt;I2C EEPROM&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Saleae logic16 dl46.jpg|&amp;lt;small&amp;gt;ST DVIULC6-4SC6&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Saleae logic16 189z 189c.jpg|&amp;lt;small&amp;gt;Voltage regulators&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Saleae logic16 72y7.jpg|&amp;lt;small&amp;gt;72Y7&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Firmware ==&lt;br /&gt;
&lt;br /&gt;
=== Firmware and FPGA bitstream usage ===&lt;br /&gt;
&lt;br /&gt;
You can use the [http://sigrok.org/gitweb/?p=sigrok-util.git;a=tree;f=firmware/saleae-logic16 sigrok-fwextract-saleae-logic16] tool to extract (from the &amp;quot;Logic&amp;quot; Linux binary) the FX2 firmware and the FPGA bitstreams required for using the Saleae Logic16:&lt;br /&gt;
&lt;br /&gt;
 $ &amp;#039;&amp;#039;&amp;#039;sigrok-fwextract-saleae-logic16 Logic&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 saved 5214 bytes to saleae-logic16-fx2.fw&lt;br /&gt;
 saved 149516 bytes to saleae-logic16-fpga-18.bitstream&lt;br /&gt;
 saved 149516 bytes to saleae-logic16-fpga-33.bitstream&lt;br /&gt;
&lt;br /&gt;
Copy these files to the directory where your [[libsigrok]] installation expects them (usually &amp;#039;&amp;#039;&amp;#039;/usr/local/share/sigrok-firmware&amp;#039;&amp;#039;&amp;#039;) and they will be found and used automatically by the libsigrok &amp;#039;&amp;#039;&amp;#039;saleae-logic16&amp;#039;&amp;#039;&amp;#039; driver.&lt;br /&gt;
&lt;br /&gt;
=== Technical firmware details ===&lt;br /&gt;
&lt;br /&gt;
The firmware for the FX2LP is embedded in the vendor application as a set of Intel HEX lines.  Each line is uploaded individually with a separate control transfer.  The firmware currently occupies the address range [0x0000-0x145d], but is uploaded out of order.&lt;br /&gt;
&lt;br /&gt;
See [[Saleae Logic16/Firmware]] for more details on the vendor firmware.&lt;br /&gt;
&lt;br /&gt;
== Protocol ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Sample format&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
The samples (as received via USB) for the enabled probes (3, 6, 9, or 16) are organized as follows:&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;&amp;lt;span style=&amp;quot;background-color: yellow&amp;quot;&amp;gt;0xLL 0xLL  0xMM 0xMM  0xNN 0xNN&amp;lt;/span&amp;gt;   &amp;lt;span style=&amp;quot;background-color: cyan&amp;quot;&amp;gt;0xPP 0xPP  0xQQ 0xQQ  0xRR 0xRR&amp;lt;/span&amp;gt; ...&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
In the above example, 3 probes are enabled. For each probe there are 2 bytes / 16 bits (e.g. 0xLL 0xLL for probe 0), then the next probe&amp;#039;s data is received (0xMM 0xMM for probe 1), then 0xNN 0xNN for probe 2. When 2 bytes have been received for all enabled probes, the process restarts with probe 0 again.&lt;br /&gt;
&lt;br /&gt;
The 16 bits of data per probe seem to contain the pin state of the respective probe (1: high, 0: low) at 16 different sampling points/times (which ones depends on the samplerate).&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Configuration&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
Endpoint 1 is used for configuration of the analyzer.  The transfers are &amp;quot;encrypted&amp;quot; using a simple series of additions and XORs.  Two kinds of transfers are used; a 3 byte out transfer starting with 0x81 followed by a 1 byte in transfer, and a 4 byte out transfer starting with 0x80.  It&amp;#039;s quite plausible that these provide raw read/write access to memory locations.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; style=&amp;quot;font-size: smaller; white-space: nowrap;&amp;quot; class=&amp;quot;alternategrey sigroktable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Channel number configuration&lt;br /&gt;
|-&lt;br /&gt;
| 3 channels&lt;br /&gt;
| &amp;lt;tt&amp;gt;&amp;lt;span style=&amp;quot;background-color: yellow&amp;quot;&amp;gt;0x80 0x01 0x02 &amp;#039;&amp;#039;&amp;#039;0x07&amp;#039;&amp;#039;&amp;#039;&amp;lt;/span&amp;gt;   &amp;lt;span style=&amp;quot;background-color: cyan&amp;quot;&amp;gt;0x80 0x01 0x03 &amp;#039;&amp;#039;&amp;#039;0x00&amp;#039;&amp;#039;&amp;#039;&amp;lt;/span&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 6 channels&lt;br /&gt;
| &amp;lt;tt&amp;gt;&amp;lt;span style=&amp;quot;background-color: yellow&amp;quot;&amp;gt;0x80 0x01 0x02 &amp;#039;&amp;#039;&amp;#039;0x3f&amp;#039;&amp;#039;&amp;#039;&amp;lt;/span&amp;gt;   &amp;lt;span style=&amp;quot;background-color: cyan&amp;quot;&amp;gt;0x80 0x01 0x03 &amp;#039;&amp;#039;&amp;#039;0x00&amp;#039;&amp;#039;&amp;#039;&amp;lt;/span&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 9 channels&lt;br /&gt;
| &amp;lt;tt&amp;gt;&amp;lt;span style=&amp;quot;background-color: yellow&amp;quot;&amp;gt;0x80 0x01 0x02 &amp;#039;&amp;#039;&amp;#039;0xff&amp;#039;&amp;#039;&amp;#039;&amp;lt;/span&amp;gt;   &amp;lt;span style=&amp;quot;background-color: cyan&amp;quot;&amp;gt;0x80 0x01 0x03 &amp;#039;&amp;#039;&amp;#039;0x01&amp;#039;&amp;#039;&amp;#039;&amp;lt;/span&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 16 channels&lt;br /&gt;
| &amp;lt;tt&amp;gt;&amp;lt;span style=&amp;quot;background-color: yellow&amp;quot;&amp;gt;0x80 0x01 0x02 &amp;#039;&amp;#039;&amp;#039;0xff&amp;#039;&amp;#039;&amp;#039;&amp;lt;/span&amp;gt;   &amp;lt;span style=&amp;quot;background-color: cyan&amp;quot;&amp;gt;0x80 0x01 0x03 &amp;#039;&amp;#039;&amp;#039;0xff&amp;#039;&amp;#039;&amp;#039;&amp;lt;/span&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; style=&amp;quot;font-size: smaller; white-space: nowrap;&amp;quot; class=&amp;quot;alternategrey sigroktable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Sampling frequency&lt;br /&gt;
|-&lt;br /&gt;
| 500kHz&lt;br /&gt;
| &amp;lt;tt&amp;gt;&amp;lt;span style=&amp;quot;background-color: yellow&amp;quot;&amp;gt;0x80 0x01 0x0a &amp;#039;&amp;#039;&amp;#039;0x00&amp;#039;&amp;#039;&amp;#039;&amp;lt;/span&amp;gt;   &amp;lt;span style=&amp;quot;background-color: cyan&amp;quot;&amp;gt;0x80 0x01 0x04 &amp;#039;&amp;#039;&amp;#039;0xc7&amp;#039;&amp;#039;&amp;#039;&amp;lt;/span&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 1MHz&lt;br /&gt;
| &amp;lt;tt&amp;gt;&amp;lt;span style=&amp;quot;background-color: yellow&amp;quot;&amp;gt;0x80 0x01 0x0a &amp;#039;&amp;#039;&amp;#039;0x00&amp;#039;&amp;#039;&amp;#039;&amp;lt;/span&amp;gt;   &amp;lt;span style=&amp;quot;background-color: cyan&amp;quot;&amp;gt;0x80 0x01 0x04 &amp;#039;&amp;#039;&amp;#039;0x63&amp;#039;&amp;#039;&amp;#039;&amp;lt;/span&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 2MHz&lt;br /&gt;
| &amp;lt;tt&amp;gt;&amp;lt;span style=&amp;quot;background-color: yellow&amp;quot;&amp;gt;0x80 0x01 0x0a &amp;#039;&amp;#039;&amp;#039;0x00&amp;#039;&amp;#039;&amp;#039;&amp;lt;/span&amp;gt;   &amp;lt;span style=&amp;quot;background-color: cyan&amp;quot;&amp;gt;0x80 0x01 0x04 &amp;#039;&amp;#039;&amp;#039;0x31&amp;#039;&amp;#039;&amp;#039;&amp;lt;/span&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 4MHz&lt;br /&gt;
| &amp;lt;tt&amp;gt;&amp;lt;span style=&amp;quot;background-color: yellow&amp;quot;&amp;gt;0x80 0x01 0x0a &amp;#039;&amp;#039;&amp;#039;0x00&amp;#039;&amp;#039;&amp;#039;&amp;lt;/span&amp;gt;   &amp;lt;span style=&amp;quot;background-color: cyan&amp;quot;&amp;gt;0x80 0x01 0x04 &amp;#039;&amp;#039;&amp;#039;0x18&amp;#039;&amp;#039;&amp;#039;&amp;lt;/span&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 5MHz&lt;br /&gt;
| &amp;lt;tt&amp;gt;&amp;lt;span style=&amp;quot;background-color: yellow&amp;quot;&amp;gt;0x80 0x01 0x0a &amp;#039;&amp;#039;&amp;#039;0x00&amp;#039;&amp;#039;&amp;#039;&amp;lt;/span&amp;gt;   &amp;lt;span style=&amp;quot;background-color: cyan&amp;quot;&amp;gt;0x80 0x01 0x04 &amp;#039;&amp;#039;&amp;#039;0x13&amp;#039;&amp;#039;&amp;#039;&amp;lt;/span&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 8MHz&lt;br /&gt;
| &amp;lt;tt&amp;gt;&amp;lt;span style=&amp;quot;background-color: yellow&amp;quot;&amp;gt;0x80 0x01 0x0a &amp;#039;&amp;#039;&amp;#039;0x01&amp;#039;&amp;#039;&amp;#039;&amp;lt;/span&amp;gt;   &amp;lt;span style=&amp;quot;background-color: cyan&amp;quot;&amp;gt;0x80 0x01 0x04 &amp;#039;&amp;#039;&amp;#039;0x13&amp;#039;&amp;#039;&amp;#039;&amp;lt;/span&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 10MHz&lt;br /&gt;
| &amp;lt;tt&amp;gt;&amp;lt;span style=&amp;quot;background-color: yellow&amp;quot;&amp;gt;0x80 0x01 0x0a &amp;#039;&amp;#039;&amp;#039;0x00&amp;#039;&amp;#039;&amp;#039;&amp;lt;/span&amp;gt;   &amp;lt;span style=&amp;quot;background-color: cyan&amp;quot;&amp;gt;0x80 0x01 0x04 &amp;#039;&amp;#039;&amp;#039;0x09&amp;#039;&amp;#039;&amp;#039;&amp;lt;/span&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 12.5MHz&lt;br /&gt;
| &amp;lt;tt&amp;gt;&amp;lt;span style=&amp;quot;background-color: yellow&amp;quot;&amp;gt;0x80 0x01 0x0a &amp;#039;&amp;#039;&amp;#039;0x00&amp;#039;&amp;#039;&amp;#039;&amp;lt;/span&amp;gt;   &amp;lt;span style=&amp;quot;background-color: cyan&amp;quot;&amp;gt;0x80 0x01 0x04 &amp;#039;&amp;#039;&amp;#039;0x07&amp;#039;&amp;#039;&amp;#039;&amp;lt;/span&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 16MHz&lt;br /&gt;
| &amp;lt;tt&amp;gt;&amp;lt;span style=&amp;quot;background-color: yellow&amp;quot;&amp;gt;0x80 0x01 0x0a &amp;#039;&amp;#039;&amp;#039;0x01&amp;#039;&amp;#039;&amp;#039;&amp;lt;/span&amp;gt;   &amp;lt;span style=&amp;quot;background-color: cyan&amp;quot;&amp;gt;0x80 0x01 0x04 &amp;#039;&amp;#039;&amp;#039;0x09&amp;#039;&amp;#039;&amp;#039;&amp;lt;/span&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 25MHz&lt;br /&gt;
| &amp;lt;tt&amp;gt;&amp;lt;span style=&amp;quot;background-color: yellow&amp;quot;&amp;gt;0x80 0x01 0x0a &amp;#039;&amp;#039;&amp;#039;0x00&amp;#039;&amp;#039;&amp;#039;&amp;lt;/span&amp;gt;   &amp;lt;span style=&amp;quot;background-color: cyan&amp;quot;&amp;gt;0x80 0x01 0x04 &amp;#039;&amp;#039;&amp;#039;0x03&amp;#039;&amp;#039;&amp;#039;&amp;lt;/span&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 32MHz&lt;br /&gt;
| &amp;lt;tt&amp;gt;&amp;lt;span style=&amp;quot;background-color: yellow&amp;quot;&amp;gt;0x80 0x01 0x0a &amp;#039;&amp;#039;&amp;#039;0x01&amp;#039;&amp;#039;&amp;#039;&amp;lt;/span&amp;gt;   &amp;lt;span style=&amp;quot;background-color: cyan&amp;quot;&amp;gt;0x80 0x01 0x04 &amp;#039;&amp;#039;&amp;#039;0x04&amp;#039;&amp;#039;&amp;#039;&amp;lt;/span&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 40MHz&lt;br /&gt;
| &amp;lt;tt&amp;gt;&amp;lt;span style=&amp;quot;background-color: yellow&amp;quot;&amp;gt;0x80 0x01 0x0a &amp;#039;&amp;#039;&amp;#039;0x01&amp;#039;&amp;#039;&amp;#039;&amp;lt;/span&amp;gt;   &amp;lt;span style=&amp;quot;background-color: cyan&amp;quot;&amp;gt;0x80 0x01 0x04 &amp;#039;&amp;#039;&amp;#039;0x03&amp;#039;&amp;#039;&amp;#039;&amp;lt;/span&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 50MHz&lt;br /&gt;
| &amp;lt;tt&amp;gt;&amp;lt;span style=&amp;quot;background-color: yellow&amp;quot;&amp;gt;0x80 0x01 0x0a &amp;#039;&amp;#039;&amp;#039;0x00&amp;#039;&amp;#039;&amp;#039;&amp;lt;/span&amp;gt;   &amp;lt;span style=&amp;quot;background-color: cyan&amp;quot;&amp;gt;0x80 0x01 0x04 &amp;#039;&amp;#039;&amp;#039;0x01&amp;#039;&amp;#039;&amp;#039;&amp;lt;/span&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 80MHz&lt;br /&gt;
| &amp;lt;tt&amp;gt;&amp;lt;span style=&amp;quot;background-color: yellow&amp;quot;&amp;gt;0x80 0x01 0x0a &amp;#039;&amp;#039;&amp;#039;0x01&amp;#039;&amp;#039;&amp;#039;&amp;lt;/span&amp;gt;   &amp;lt;span style=&amp;quot;background-color: cyan&amp;quot;&amp;gt;0x80 0x01 0x04 &amp;#039;&amp;#039;&amp;#039;0x01&amp;#039;&amp;#039;&amp;#039;&amp;lt;/span&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 100MHz&lt;br /&gt;
| &amp;lt;tt&amp;gt;&amp;lt;span style=&amp;quot;background-color: yellow&amp;quot;&amp;gt;0x80 0x01 0x0a &amp;#039;&amp;#039;&amp;#039;0x00&amp;#039;&amp;#039;&amp;#039;&amp;lt;/span&amp;gt;   &amp;lt;span style=&amp;quot;background-color: cyan&amp;quot;&amp;gt;0x80 0x01 0x04 &amp;#039;&amp;#039;&amp;#039;0x00&amp;#039;&amp;#039;&amp;#039;&amp;lt;/span&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Resources ==&lt;br /&gt;
&lt;br /&gt;
* [http://downloads.saleae.com/Logic+Guide.pdf Manual]&lt;br /&gt;
* [http://www.saleae.com/downloads Vendor software]&lt;br /&gt;
* [http://community.saleae.com/ SDKs]&lt;br /&gt;
&lt;br /&gt;
[[Category:Device]]&lt;br /&gt;
[[Category:Logic analyzer]]&lt;br /&gt;
[[Category:Supported]]&lt;/div&gt;</summary>
		<author><name>Marcus Comstedt</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=Saleae_Logic16/Firmware&amp;diff=10746</id>
		<title>Saleae Logic16/Firmware</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=Saleae_Logic16/Firmware&amp;diff=10746"/>
		<updated>2015-04-22T19:34:38Z</updated>

		<summary type="html">&lt;p&gt;Marcus Comstedt: Updated to contain renumbering of variables and bits in new FPGA bitstream&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The following information is related to the vendor firmware included with the version 1.1.15 of the vendor application &amp;quot;Logic&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Interrupt handlers ==&lt;br /&gt;
&lt;br /&gt;
The following interrupt handlers are installed. If the address is absent, it means the handler just returns (RETI) without performing any action.  Addresses in red is for the new firmware version (vendor software version 1.1.34).&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; style=&amp;quot;font-size: smaller;&amp;quot; class=&amp;quot;alternategrey sigroktable&amp;quot;&lt;br /&gt;
!Handler&lt;br /&gt;
!Address&lt;br /&gt;
|-&lt;br /&gt;
| RESET&lt;br /&gt;
| 0x0000&lt;br /&gt;
|-&lt;br /&gt;
| TF2&lt;br /&gt;
| 0x0e65&lt;br /&gt;
|-&lt;br /&gt;
| RESUME&lt;br /&gt;
| 0x002e&lt;br /&gt;
|-&lt;br /&gt;
| SUDAV&lt;br /&gt;
| 0x0ae8&lt;br /&gt;
|-&lt;br /&gt;
| SOF&lt;br /&gt;
| 0x13d2 &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;0x13d6&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| SUTOK&lt;br /&gt;
| 0x13bf &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;0x13c3&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| SUSPEND&lt;br /&gt;
| 0x13aa &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;0x13ae&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| USB_RESET&lt;br /&gt;
| 0x130b &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;0x130f&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| HISPEED&lt;br /&gt;
| 0x12df &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;0x12e3&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| EP0ACK&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| EP0_IN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| EP0_OUT&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| EP1_IN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| EP1_OUT&lt;br /&gt;
| 0x115d &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;0x1161&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| EP2&lt;br /&gt;
| 0x11a2 &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;0x11a6&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| EP4&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| EP6&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| EP8&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| IBN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| EP0PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| EP1PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| EP2PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| EP4PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| EP6PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| EP8PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| ERRLIMIT&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| EP2ISOERR&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| EP4ISOERRF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| EP6ISOERR&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| EP8ISOERRF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| EP2PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| EP4PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| EP6PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| EP8PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| EP2EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| EP4EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| EP6EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| EP8EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| EP2FF&lt;br /&gt;
| 0x11e7 &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;0x11eb&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| EP4FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| EP6FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| EP8FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| GPIFDONE&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| GPIFWF&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Endpoint 1 OUT (EP1_OUT) handler ===&lt;br /&gt;
&lt;br /&gt;
After decrypting the OUT packet, processing of the packet proceeds depending on the first byte of the packet, which selects the operation. After the operation, any resulting IN packet will be encrypted before submitting it to the host.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; style=&amp;quot;font-size: smaller;&amp;quot; class=&amp;quot;alternategrey sigroktable&amp;quot;&lt;br /&gt;
!Byte&lt;br /&gt;
!Handler&lt;br /&gt;
!Operation&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 0x14f&lt;br /&gt;
| Configure endpoints for quad-buffered bulk FIFO operation, and trigger a GPIF read on EP2.&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 0x157&lt;br /&gt;
| Abort the GPIF. &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;In the new firmware, also reconfigures the endpoints like operation 1.&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| 0x15f &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;0x162&amp;lt;/span&amp;gt;&lt;br /&gt;
| Write data to EEPROM with I²C address 1010000 (0x50) in single byte addressing mode. The second and third byte contain a fixed magic cookie of &amp;#039;&amp;#039;&amp;#039;0x42 0x55&amp;#039;&amp;#039;&amp;#039;. The fourth byte contains the single byte address. The fifth byte contains the number of bytes to write (1-58). The rest of the packet contains the data to write.&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| 0x1b3 &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;0x1b6&amp;lt;/span&amp;gt;&lt;br /&gt;
| Read data from EEPROM with I²C address 1010000 (0x50) in single byte addressing mode. The second and third byte contain a fixed magic cookie of &amp;#039;&amp;#039;&amp;#039;0x33 0x81&amp;#039;&amp;#039;&amp;#039;. The fourth byte contains the single byte address. The fifth byte contains the number of bytes to read (1-64). The data will be available as an IN transfer.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7a&lt;br /&gt;
| 0x309 &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;0x30c&amp;lt;/span&amp;gt;&lt;br /&gt;
| Upload the sine table for LED flashing. The second byte contains the offset to start writing at, and the third byte the number of bytes to write. A maximum of 61 bytes can be uploaded per packet, so two packets are needed to write the entire table.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7b&lt;br /&gt;
| 0x346 &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;0x349&amp;lt;/span&amp;gt;&lt;br /&gt;
| Enable or disable LED flashing. The second byte of the packet is a bool indicating if LED flashing should be enabled. The following bytes are only used if LED flashing is enabled, but are always transmitted. If flashing is enabled, the LED brighness will periodically be set from the sine table. Byte 3 and 4 of the packet are the Timer 2 reload value, in little endian format. Byte 5 is a software clock divisor. The pointer in the sine table will be advanced by one every &amp;#039;&amp;#039;&amp;#039;(0x10000 - RELOAD) * (DIV + 1) / 4000000&amp;#039;&amp;#039;&amp;#039; seconds. Byte 6 is a boolean indicating whether to repeat the waveform (1) or stop at the end of the first period (0).&lt;br /&gt;
|-&lt;br /&gt;
| 0x7c&lt;br /&gt;
| 0x282 &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;0x285&amp;lt;/span&amp;gt;&lt;br /&gt;
| Re-renumerate; return control to the builtin bootloader.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7d&lt;br /&gt;
| 0x2aa &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;0x2ad&amp;lt;/span&amp;gt;&lt;br /&gt;
| Abort the GPIF. The second byte of the packet is returned complemented in an IN transfer, as acknowledgement.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7e&lt;br /&gt;
| 0x2cf &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;0x2d2&amp;lt;/span&amp;gt;&lt;br /&gt;
| Disable LED flashing, configure the GPIF, and prepare the FPGA for bitstream upload by pulsing &amp;#039;&amp;#039;&amp;#039;PROG_B&amp;#039;&amp;#039;&amp;#039; and then waiting for &amp;#039;&amp;#039;&amp;#039;INIT_B&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7f&lt;br /&gt;
| 0x2e4 &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;0x2e7&amp;lt;/span&amp;gt;&lt;br /&gt;
| Disable LED flashing, transmit N (1-62) bytes of bitstream on the FPGA &amp;#039;&amp;#039;&amp;#039;DIN&amp;#039;&amp;#039;&amp;#039; pin, clocked by &amp;#039;&amp;#039;&amp;#039;CCLK&amp;#039;&amp;#039;&amp;#039;. The second byte of the packet encodes N.&lt;br /&gt;
|-&lt;br /&gt;
| 0x80&lt;br /&gt;
| 0x205 &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;0x208&amp;lt;/span&amp;gt;&lt;br /&gt;
| Transmit N (1-31) 16-bit words to the FPGA. The second byte of the packet encodes N. Data is sent on &amp;#039;&amp;#039;&amp;#039;PA6&amp;#039;&amp;#039;&amp;#039;, MSB-first, with rising edges of &amp;#039;&amp;#039;&amp;#039;PA5&amp;#039;&amp;#039;&amp;#039; to clock the bits out. During each word transfer, &amp;#039;&amp;#039;&amp;#039;PA4&amp;#039;&amp;#039;&amp;#039; is held low. The most significant bit (b15) of each word must be 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x81&lt;br /&gt;
| 0x23b &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;0x23e&amp;lt;/span&amp;gt;&lt;br /&gt;
| Perform N (1-31) write-read transactions to the FPGA. The second byte of the packet encodes N. Each transaction consists of 8 bits (from the out packet) being transmitted on &amp;#039;&amp;#039;&amp;#039;PA6&amp;#039;&amp;#039;&amp;#039;, like for the 0x80 operation above, and then 8 bits being received on &amp;#039;&amp;#039;&amp;#039;PA7&amp;#039;&amp;#039;&amp;#039;. N bytes will be available for an IN transfer afterwards. The most significant bit (b7) of each byte to send must be 0, but is actually transmitted as a 1 (to indicate read operation). &amp;#039;&amp;#039;&amp;#039;PA7&amp;#039;&amp;#039;&amp;#039; is polled immediately after the falling edge of &amp;#039;&amp;#039;&amp;#039;PA5&amp;#039;&amp;#039;&amp;#039;. &amp;#039;&amp;#039;&amp;#039;PA4&amp;#039;&amp;#039;&amp;#039; is held low during each write-read transaction.&lt;br /&gt;
|-&lt;br /&gt;
| 0x82&lt;br /&gt;
| 0x3a3 &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;0x3a6&amp;lt;/span&amp;gt;&lt;br /&gt;
| Read the REVID register. 16 bits of &amp;#039;&amp;#039;&amp;#039;REVID&amp;#039;&amp;#039;&amp;#039; data will be available for an IN transfer.&lt;br /&gt;
|-&lt;br /&gt;
| others&lt;br /&gt;
| 0x3c7 &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;0x3ca&amp;lt;/span&amp;gt;&lt;br /&gt;
| Do nothing&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Command 0x7e waveform ====&lt;br /&gt;
&lt;br /&gt;
[[File:Logic16 FW Command 0x7e Waveform.svg]]&lt;br /&gt;
&lt;br /&gt;
==== Command 0x7f waveform ====&lt;br /&gt;
&lt;br /&gt;
[[File:Logic16 FW Command 0x7f Waveform.svg]]&lt;br /&gt;
&lt;br /&gt;
==== Command 0x80 waveform ====&lt;br /&gt;
&lt;br /&gt;
[[File:Logic16 FW Command 0x80 Waveform.svg]]&lt;br /&gt;
&lt;br /&gt;
==== Command 0x81 waveform ====&lt;br /&gt;
&lt;br /&gt;
[[File:Logic16 FW Command 0x81 Waveform.svg]]&lt;br /&gt;
&lt;br /&gt;
== XDATA variables ==&lt;br /&gt;
&lt;br /&gt;
The following variables are stored in the 8K &amp;quot;external&amp;quot; code/data memory, after the firmware code.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; style=&amp;quot;font-size: smaller;&amp;quot; class=&amp;quot;alternategrey sigroktable&amp;quot;&lt;br /&gt;
!rowspan=&amp;quot;2&amp;quot;|Address&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Init data in FW&lt;br /&gt;
!rowspan=&amp;quot;2&amp;quot;|Contents&lt;br /&gt;
|-&lt;br /&gt;
!Address&lt;br /&gt;
!Value&lt;br /&gt;
|-&lt;br /&gt;
| 0x1f00-0x1f7f&lt;br /&gt;
| 0x8d6-0x955&lt;br /&gt;
|&lt;br /&gt;
| WAVEDATA&lt;br /&gt;
|-&lt;br /&gt;
| 0x1f80&lt;br /&gt;
| 0x981&lt;br /&gt;
| 0xe0&lt;br /&gt;
| GPIFREADYCFG&lt;br /&gt;
|-&lt;br /&gt;
| 0x1f81&lt;br /&gt;
| 0x982&lt;br /&gt;
| 0x10&lt;br /&gt;
| GPIFCTLCFG&lt;br /&gt;
|-&lt;br /&gt;
| 0x1f82&lt;br /&gt;
| 0x983&lt;br /&gt;
| 0x00&lt;br /&gt;
| GPIFIDLECS&lt;br /&gt;
|-&lt;br /&gt;
| 0x1f83&lt;br /&gt;
| 0x984&lt;br /&gt;
| 0x05&lt;br /&gt;
| GPIFIDLECTL&lt;br /&gt;
|-&lt;br /&gt;
| 0x1f84&lt;br /&gt;
| 0x985&lt;br /&gt;
| 0xee&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x1f85&lt;br /&gt;
| 0x986&lt;br /&gt;
| 0x50&lt;br /&gt;
| GPIFWFSELECT&lt;br /&gt;
|-&lt;br /&gt;
| 0x1f86&lt;br /&gt;
| 0x987&lt;br /&gt;
| 0x00&lt;br /&gt;
| GPIFREADYSTAT&lt;br /&gt;
|-&lt;br /&gt;
| 0x1f87&lt;br /&gt;
| 0x95a&lt;br /&gt;
| 0x00&lt;br /&gt;
| FLOWSTATE&lt;br /&gt;
|-&lt;br /&gt;
| 0x1f88&lt;br /&gt;
| 0x95b&lt;br /&gt;
| 0x00&lt;br /&gt;
| FLOWLOGIC&lt;br /&gt;
|-&lt;br /&gt;
| 0x1f89&lt;br /&gt;
| 0x95c&lt;br /&gt;
| 0x00&lt;br /&gt;
| FLOWEQ0CTL&lt;br /&gt;
|-&lt;br /&gt;
| 0x1f8a&lt;br /&gt;
| 0x95d&lt;br /&gt;
| 0x00&lt;br /&gt;
| FLOWEQ1CTL&lt;br /&gt;
|-&lt;br /&gt;
| 0x1f8b&lt;br /&gt;
| 0x95e&lt;br /&gt;
| 0x00&lt;br /&gt;
| FLOWHOLDOFF&lt;br /&gt;
|-&lt;br /&gt;
| 0x1f8c&lt;br /&gt;
| 0x95f&lt;br /&gt;
| 0x00&lt;br /&gt;
| FLOWSTB&lt;br /&gt;
|-&lt;br /&gt;
| 0x1f8d&lt;br /&gt;
| 0x960&lt;br /&gt;
| 0x00&lt;br /&gt;
| FLOWSTBEDGE&lt;br /&gt;
|-&lt;br /&gt;
| 0x1f8e&lt;br /&gt;
| 0x961&lt;br /&gt;
| 0x00&lt;br /&gt;
| FLOWSTBHPERIOD&lt;br /&gt;
|-&lt;br /&gt;
| 0x1f8f-0x1faa&lt;br /&gt;
| 0x962-0x97d&lt;br /&gt;
| 0x00&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x1fab-0x1fea&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 64 byte sine table for LED flashing&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== WAVEDATA ===&lt;br /&gt;
&lt;br /&gt;
The following data is loaded into WAVEDATA on bootup, and whenever operation 0x7e is performed:&lt;br /&gt;
&lt;br /&gt;
==== Waveform descriptor 0 ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; style=&amp;quot;font-size: smaller;&amp;quot; class=&amp;quot;alternategrey sigroktable&amp;quot;&lt;br /&gt;
!State&lt;br /&gt;
!Length/Branch&lt;br /&gt;
!Opcode&lt;br /&gt;
!Output&lt;br /&gt;
!Logic&lt;br /&gt;
!Operation&lt;br /&gt;
!NEXT&lt;br /&gt;
!DATA&lt;br /&gt;
!CTL2&lt;br /&gt;
!CTL1&lt;br /&gt;
!CTL0&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 0x81&lt;br /&gt;
| 0x01  &lt;br /&gt;
| 0x05  &lt;br /&gt;
| 0x70&lt;br /&gt;
| if FF or RDY0 then 0 (ReExec) else 1&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 0xB8  &lt;br /&gt;
| 0x07  &lt;br /&gt;
| 0x04  &lt;br /&gt;
| 0x2D&lt;br /&gt;
| if TC expired then 7 else 0&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 0x01  &lt;br /&gt;
| 0x02  &lt;br /&gt;
| 0x04  &lt;br /&gt;
| 0x00  &lt;br /&gt;
| Delay 1&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| 0x01  &lt;br /&gt;
| 0x02  &lt;br /&gt;
| 0x04  &lt;br /&gt;
| 0x00  &lt;br /&gt;
| Delay 1&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 0x01  &lt;br /&gt;
| 0x02  &lt;br /&gt;
| 0x04  &lt;br /&gt;
| 0x00  &lt;br /&gt;
| Delay 1&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| 0x01  &lt;br /&gt;
| 0x02  &lt;br /&gt;
| 0x04  &lt;br /&gt;
| 0x00  &lt;br /&gt;
| Delay 1&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| 0x01  &lt;br /&gt;
| 0x02  &lt;br /&gt;
| 0x04  &lt;br /&gt;
| 0x00  &lt;br /&gt;
| Delay 1&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Waveform descriptor 1-3 ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; style=&amp;quot;font-size: smaller;&amp;quot; class=&amp;quot;alternategrey sigroktable&amp;quot;&lt;br /&gt;
!State&lt;br /&gt;
!Length/Branch&lt;br /&gt;
!Opcode&lt;br /&gt;
!Output&lt;br /&gt;
!Logic&lt;br /&gt;
!Operation&lt;br /&gt;
!NEXT&lt;br /&gt;
!DATA&lt;br /&gt;
!CTL2&lt;br /&gt;
!CTL1&lt;br /&gt;
!CTL0&lt;br /&gt;
|-&lt;br /&gt;
| 0-6&lt;br /&gt;
| 0x01&lt;br /&gt;
| 0x00&lt;br /&gt;
| 0x05&lt;br /&gt;
| 0x00&lt;br /&gt;
| Delay 1&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== FPGA variables ==&lt;br /&gt;
&lt;br /&gt;
The following variables can be read and written by the host using operations 0x81 and 0x80 (red numbers indicate variable and bit numbers in the new version bitstreams):&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; style=&amp;quot;font-size: smaller;&amp;quot; class=&amp;quot;alternategrey sigroktable&amp;quot;&lt;br /&gt;
! style=&amp;quot;width: 4em;&amp;quot; | Address&lt;br /&gt;
! style=&amp;quot;width: 3em;&amp;quot; | Bit&lt;br /&gt;
! Contents&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;0x07&amp;lt;/span&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;FPGA bitstream version&amp;#039;&amp;#039;&amp;#039; (currently 0x10  &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;0x13&amp;lt;/span&amp;gt;).&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;0x0f&amp;lt;/span&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Status and control&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| 0 &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;5&amp;lt;/span&amp;gt;&lt;br /&gt;
| Acquisition running&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| 1 &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;3&amp;lt;/span&amp;gt;&lt;br /&gt;
| Update acquisition parameters(?)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| 2&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| 3 &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;4&amp;lt;/span&amp;gt;&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| 4&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| 5 &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt;&lt;br /&gt;
| FIFO overflow&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| 6 &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;2&amp;lt;/span&amp;gt;&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| 7&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;0x01&amp;lt;/span&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Channel select low&amp;#039;&amp;#039;&amp;#039;. Each 1 bit in this byte enables one of the channels 0-7 for acquisition.&lt;br /&gt;
|-&lt;br /&gt;
| 0x03 &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;0x06&amp;lt;/span&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Channel select high&amp;#039;&amp;#039;&amp;#039;. Each 1 bit in this byte enables one of the channels 8-15 for acquisition.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;0x0b&amp;lt;/span&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Sampling rate divisor&amp;#039;&amp;#039;&amp;#039;. Sample rate is the base clock divided by N+1, where N is the value in this register.&lt;br /&gt;
|-&lt;br /&gt;
| 0x05 &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;0x05&amp;lt;/span&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;LED brightness&amp;#039;&amp;#039;&amp;#039;. 0 = min (off), 0xff = max, 0x19 = dimmed.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06 &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;0x0e&amp;lt;/span&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x07 &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;0x02&amp;lt;/span&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
|&lt;br /&gt;
| ? (Read on acquisition stop.)&lt;br /&gt;
|-&lt;br /&gt;
| 0x09&lt;br /&gt;
|&lt;br /&gt;
| ? (Read on acquisition stop.)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0a &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;0x04&amp;lt;/span&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| 0 &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;2&amp;lt;/span&amp;gt;&lt;br /&gt;
| Sampling base clock select: 0 = 100MHz, 1 = 160MHz&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| 1&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| 2&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| 3&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| 4&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| 5&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| 6 &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;7&amp;lt;/span&amp;gt;&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| 7 &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 0x0c &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;0x03&amp;lt;/span&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
| ?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== EEPROM layout ==&lt;br /&gt;
&lt;br /&gt;
The Saleae Logic16 has a 256-byte I2C EEPROM with the following layout:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;background-color: orange&amp;quot;&amp;gt;c0&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;background-color: lime&amp;quot;&amp;gt;a9 21&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;background-color: green&amp;quot;&amp;gt;01 10&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;background-color: lightgreen&amp;quot;&amp;gt;00 00&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;background-color: brown&amp;quot;&amp;gt;00&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;background-color: yellow&amp;quot;&amp;gt;aa bb cc dd ee ff gg hh&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;background-color: cyan&amp;quot;&amp;gt;xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx&amp;lt;/span&amp;gt;&lt;br /&gt;
 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff&lt;br /&gt;
 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff&lt;br /&gt;
 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff&lt;br /&gt;
 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff&lt;br /&gt;
 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff&lt;br /&gt;
 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff&lt;br /&gt;
 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff&lt;br /&gt;
 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff&lt;br /&gt;
 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff&lt;br /&gt;
 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff&lt;br /&gt;
 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff&lt;br /&gt;
 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff&lt;br /&gt;
 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff&lt;br /&gt;
 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff&lt;br /&gt;
&lt;br /&gt;
Description:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; style=&amp;quot;font-size: smaller;&amp;quot; class=&amp;quot;alternategrey sigroktable&amp;quot;&lt;br /&gt;
!Bytes&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background-color: orange&amp;quot; | 0&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;0xc0&amp;#039;&amp;#039;&amp;#039;: FX2 &amp;quot;c0 load&amp;quot; mode, i.e. VID/PID/DID are loaded from EEPROM (but not firmware).&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background-color: lime&amp;quot; | 1-2&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;0x21a9&amp;#039;&amp;#039;&amp;#039;: USB vendor ID (VID).&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background-color: green&amp;quot; | 3-4&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;0x1001&amp;#039;&amp;#039;&amp;#039;: USB product ID (PID).&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | 5-6&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;0x0000&amp;#039;&amp;#039;&amp;#039;: USB device ID (DID).&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background-color: brown&amp;quot; | 7&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;0x00&amp;#039;&amp;#039;&amp;#039;: FX2 configuration byte (see FX2 TRM for details).&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background-color: yellow&amp;quot; | 8-15&lt;br /&gt;
| A unique device identifier / serial number for this Logic16 (8 bytes).&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background-color: cyan&amp;quot; | 16-31&lt;br /&gt;
| &amp;quot;Magic&amp;quot; values that are different for each Logic16 device (16 bytes).&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Marcus Comstedt</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=Saleae_Logic16/Firmware&amp;diff=10745</id>
		<title>Saleae Logic16/Firmware</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=Saleae_Logic16/Firmware&amp;diff=10745"/>
		<updated>2015-04-17T21:16:45Z</updated>

		<summary type="html">&lt;p&gt;Marcus Comstedt: Updated to contain changes in new firmware&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The following information is related to the vendor firmware included with the version 1.1.15 of the vendor application &amp;quot;Logic&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Interrupt handlers ==&lt;br /&gt;
&lt;br /&gt;
The following interrupt handlers are installed. If the address is absent, it means the handler just returns (RETI) without performing any action.  Addresses in red is for the new firmware version (vendor software version 1.1.34).&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; style=&amp;quot;font-size: smaller;&amp;quot; class=&amp;quot;alternategrey sigroktable&amp;quot;&lt;br /&gt;
!Handler&lt;br /&gt;
!Address&lt;br /&gt;
|-&lt;br /&gt;
| RESET&lt;br /&gt;
| 0x0000&lt;br /&gt;
|-&lt;br /&gt;
| TF2&lt;br /&gt;
| 0x0e65&lt;br /&gt;
|-&lt;br /&gt;
| RESUME&lt;br /&gt;
| 0x002e&lt;br /&gt;
|-&lt;br /&gt;
| SUDAV&lt;br /&gt;
| 0x0ae8&lt;br /&gt;
|-&lt;br /&gt;
| SOF&lt;br /&gt;
| 0x13d2 &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;0x13d6&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| SUTOK&lt;br /&gt;
| 0x13bf &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;0x13c3&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| SUSPEND&lt;br /&gt;
| 0x13aa &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;0x13ae&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| USB_RESET&lt;br /&gt;
| 0x130b &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;0x130f&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| HISPEED&lt;br /&gt;
| 0x12df &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;0x12e3&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| EP0ACK&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| EP0_IN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| EP0_OUT&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| EP1_IN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| EP1_OUT&lt;br /&gt;
| 0x115d &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;0x1161&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| EP2&lt;br /&gt;
| 0x11a2 &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;0x11a6&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| EP4&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| EP6&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| EP8&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| IBN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| EP0PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| EP1PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| EP2PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| EP4PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| EP6PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| EP8PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| ERRLIMIT&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| EP2ISOERR&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| EP4ISOERRF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| EP6ISOERR&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| EP8ISOERRF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| EP2PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| EP4PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| EP6PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| EP8PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| EP2EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| EP4EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| EP6EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| EP8EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| EP2FF&lt;br /&gt;
| 0x11e7 &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;0x11eb&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| EP4FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| EP6FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| EP8FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| GPIFDONE&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| GPIFWF&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Endpoint 1 OUT (EP1_OUT) handler ===&lt;br /&gt;
&lt;br /&gt;
After decrypting the OUT packet, processing of the packet proceeds depending on the first byte of the packet, which selects the operation. After the operation, any resulting IN packet will be encrypted before submitting it to the host.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; style=&amp;quot;font-size: smaller;&amp;quot; class=&amp;quot;alternategrey sigroktable&amp;quot;&lt;br /&gt;
!Byte&lt;br /&gt;
!Handler&lt;br /&gt;
!Operation&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 0x14f&lt;br /&gt;
| Configure endpoints for quad-buffered bulk FIFO operation, and trigger a GPIF read on EP2.&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 0x157&lt;br /&gt;
| Abort the GPIF. &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;In the new firmware, also reconfigures the endpoints like operation 1.&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| 0x15f &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;0x162&amp;lt;/span&amp;gt;&lt;br /&gt;
| Write data to EEPROM with I²C address 1010000 (0x50) in single byte addressing mode. The second and third byte contain a fixed magic cookie of &amp;#039;&amp;#039;&amp;#039;0x42 0x55&amp;#039;&amp;#039;&amp;#039;. The fourth byte contains the single byte address. The fifth byte contains the number of bytes to write (1-58). The rest of the packet contains the data to write.&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| 0x1b3 &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;0x1b6&amp;lt;/span&amp;gt;&lt;br /&gt;
| Read data from EEPROM with I²C address 1010000 (0x50) in single byte addressing mode. The second and third byte contain a fixed magic cookie of &amp;#039;&amp;#039;&amp;#039;0x33 0x81&amp;#039;&amp;#039;&amp;#039;. The fourth byte contains the single byte address. The fifth byte contains the number of bytes to read (1-64). The data will be available as an IN transfer.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7a&lt;br /&gt;
| 0x309 &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;0x30c&amp;lt;/span&amp;gt;&lt;br /&gt;
| Upload the sine table for LED flashing. The second byte contains the offset to start writing at, and the third byte the number of bytes to write. A maximum of 61 bytes can be uploaded per packet, so two packets are needed to write the entire table.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7b&lt;br /&gt;
| 0x346 &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;0x349&amp;lt;/span&amp;gt;&lt;br /&gt;
| Enable or disable LED flashing. The second byte of the packet is a bool indicating if LED flashing should be enabled. The following bytes are only used if LED flashing is enabled, but are always transmitted. If flashing is enabled, the LED brighness will periodically be set from the sine table. Byte 3 and 4 of the packet are the Timer 2 reload value, in little endian format. Byte 5 is a software clock divisor. The pointer in the sine table will be advanced by one every &amp;#039;&amp;#039;&amp;#039;(0x10000 - RELOAD) * (DIV + 1) / 4000000&amp;#039;&amp;#039;&amp;#039; seconds. Byte 6 is a boolean indicating whether to repeat the waveform (1) or stop at the end of the first period (0).&lt;br /&gt;
|-&lt;br /&gt;
| 0x7c&lt;br /&gt;
| 0x282 &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;0x285&amp;lt;/span&amp;gt;&lt;br /&gt;
| Re-renumerate; return control to the builtin bootloader.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7d&lt;br /&gt;
| 0x2aa &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;0x2ad&amp;lt;/span&amp;gt;&lt;br /&gt;
| Abort the GPIF. The second byte of the packet is returned complemented in an IN transfer, as acknowledgement.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7e&lt;br /&gt;
| 0x2cf &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;0x2d2&amp;lt;/span&amp;gt;&lt;br /&gt;
| Disable LED flashing, configure the GPIF, and prepare the FPGA for bitstream upload by pulsing &amp;#039;&amp;#039;&amp;#039;PROG_B&amp;#039;&amp;#039;&amp;#039; and then waiting for &amp;#039;&amp;#039;&amp;#039;INIT_B&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7f&lt;br /&gt;
| 0x2e4 &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;0x2e7&amp;lt;/span&amp;gt;&lt;br /&gt;
| Disable LED flashing, transmit N (1-62) bytes of bitstream on the FPGA &amp;#039;&amp;#039;&amp;#039;DIN&amp;#039;&amp;#039;&amp;#039; pin, clocked by &amp;#039;&amp;#039;&amp;#039;CCLK&amp;#039;&amp;#039;&amp;#039;. The second byte of the packet encodes N.&lt;br /&gt;
|-&lt;br /&gt;
| 0x80&lt;br /&gt;
| 0x205 &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;0x208&amp;lt;/span&amp;gt;&lt;br /&gt;
| Transmit N (1-31) 16-bit words to the FPGA. The second byte of the packet encodes N. Data is sent on &amp;#039;&amp;#039;&amp;#039;PA6&amp;#039;&amp;#039;&amp;#039;, MSB-first, with rising edges of &amp;#039;&amp;#039;&amp;#039;PA5&amp;#039;&amp;#039;&amp;#039; to clock the bits out. During each word transfer, &amp;#039;&amp;#039;&amp;#039;PA4&amp;#039;&amp;#039;&amp;#039; is held low. The most significant bit (b15) of each word must be 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x81&lt;br /&gt;
| 0x23b &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;0x23e&amp;lt;/span&amp;gt;&lt;br /&gt;
| Perform N (1-31) write-read transactions to the FPGA. The second byte of the packet encodes N. Each transaction consists of 8 bits (from the out packet) being transmitted on &amp;#039;&amp;#039;&amp;#039;PA6&amp;#039;&amp;#039;&amp;#039;, like for the 0x80 operation above, and then 8 bits being received on &amp;#039;&amp;#039;&amp;#039;PA7&amp;#039;&amp;#039;&amp;#039;. N bytes will be available for an IN transfer afterwards. The most significant bit (b7) of each byte to send must be 0, but is actually transmitted as a 1 (to indicate read operation). &amp;#039;&amp;#039;&amp;#039;PA7&amp;#039;&amp;#039;&amp;#039; is polled immediately after the falling edge of &amp;#039;&amp;#039;&amp;#039;PA5&amp;#039;&amp;#039;&amp;#039;. &amp;#039;&amp;#039;&amp;#039;PA4&amp;#039;&amp;#039;&amp;#039; is held low during each write-read transaction.&lt;br /&gt;
|-&lt;br /&gt;
| 0x82&lt;br /&gt;
| 0x3a3 &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;0x3a6&amp;lt;/span&amp;gt;&lt;br /&gt;
| Read the REVID register. 16 bits of &amp;#039;&amp;#039;&amp;#039;REVID&amp;#039;&amp;#039;&amp;#039; data will be available for an IN transfer.&lt;br /&gt;
|-&lt;br /&gt;
| others&lt;br /&gt;
| 0x3c7 &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;0x3ca&amp;lt;/span&amp;gt;&lt;br /&gt;
| Do nothing&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Command 0x7e waveform ====&lt;br /&gt;
&lt;br /&gt;
[[File:Logic16 FW Command 0x7e Waveform.svg]]&lt;br /&gt;
&lt;br /&gt;
==== Command 0x7f waveform ====&lt;br /&gt;
&lt;br /&gt;
[[File:Logic16 FW Command 0x7f Waveform.svg]]&lt;br /&gt;
&lt;br /&gt;
==== Command 0x80 waveform ====&lt;br /&gt;
&lt;br /&gt;
[[File:Logic16 FW Command 0x80 Waveform.svg]]&lt;br /&gt;
&lt;br /&gt;
==== Command 0x81 waveform ====&lt;br /&gt;
&lt;br /&gt;
[[File:Logic16 FW Command 0x81 Waveform.svg]]&lt;br /&gt;
&lt;br /&gt;
== XDATA variables ==&lt;br /&gt;
&lt;br /&gt;
The following variables are stored in the 8K &amp;quot;external&amp;quot; code/data memory, after the firmware code.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; style=&amp;quot;font-size: smaller;&amp;quot; class=&amp;quot;alternategrey sigroktable&amp;quot;&lt;br /&gt;
!rowspan=&amp;quot;2&amp;quot;|Address&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Init data in FW&lt;br /&gt;
!rowspan=&amp;quot;2&amp;quot;|Contents&lt;br /&gt;
|-&lt;br /&gt;
!Address&lt;br /&gt;
!Value&lt;br /&gt;
|-&lt;br /&gt;
| 0x1f00-0x1f7f&lt;br /&gt;
| 0x8d6-0x955&lt;br /&gt;
|&lt;br /&gt;
| WAVEDATA&lt;br /&gt;
|-&lt;br /&gt;
| 0x1f80&lt;br /&gt;
| 0x981&lt;br /&gt;
| 0xe0&lt;br /&gt;
| GPIFREADYCFG&lt;br /&gt;
|-&lt;br /&gt;
| 0x1f81&lt;br /&gt;
| 0x982&lt;br /&gt;
| 0x10&lt;br /&gt;
| GPIFCTLCFG&lt;br /&gt;
|-&lt;br /&gt;
| 0x1f82&lt;br /&gt;
| 0x983&lt;br /&gt;
| 0x00&lt;br /&gt;
| GPIFIDLECS&lt;br /&gt;
|-&lt;br /&gt;
| 0x1f83&lt;br /&gt;
| 0x984&lt;br /&gt;
| 0x05&lt;br /&gt;
| GPIFIDLECTL&lt;br /&gt;
|-&lt;br /&gt;
| 0x1f84&lt;br /&gt;
| 0x985&lt;br /&gt;
| 0xee&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x1f85&lt;br /&gt;
| 0x986&lt;br /&gt;
| 0x50&lt;br /&gt;
| GPIFWFSELECT&lt;br /&gt;
|-&lt;br /&gt;
| 0x1f86&lt;br /&gt;
| 0x987&lt;br /&gt;
| 0x00&lt;br /&gt;
| GPIFREADYSTAT&lt;br /&gt;
|-&lt;br /&gt;
| 0x1f87&lt;br /&gt;
| 0x95a&lt;br /&gt;
| 0x00&lt;br /&gt;
| FLOWSTATE&lt;br /&gt;
|-&lt;br /&gt;
| 0x1f88&lt;br /&gt;
| 0x95b&lt;br /&gt;
| 0x00&lt;br /&gt;
| FLOWLOGIC&lt;br /&gt;
|-&lt;br /&gt;
| 0x1f89&lt;br /&gt;
| 0x95c&lt;br /&gt;
| 0x00&lt;br /&gt;
| FLOWEQ0CTL&lt;br /&gt;
|-&lt;br /&gt;
| 0x1f8a&lt;br /&gt;
| 0x95d&lt;br /&gt;
| 0x00&lt;br /&gt;
| FLOWEQ1CTL&lt;br /&gt;
|-&lt;br /&gt;
| 0x1f8b&lt;br /&gt;
| 0x95e&lt;br /&gt;
| 0x00&lt;br /&gt;
| FLOWHOLDOFF&lt;br /&gt;
|-&lt;br /&gt;
| 0x1f8c&lt;br /&gt;
| 0x95f&lt;br /&gt;
| 0x00&lt;br /&gt;
| FLOWSTB&lt;br /&gt;
|-&lt;br /&gt;
| 0x1f8d&lt;br /&gt;
| 0x960&lt;br /&gt;
| 0x00&lt;br /&gt;
| FLOWSTBEDGE&lt;br /&gt;
|-&lt;br /&gt;
| 0x1f8e&lt;br /&gt;
| 0x961&lt;br /&gt;
| 0x00&lt;br /&gt;
| FLOWSTBHPERIOD&lt;br /&gt;
|-&lt;br /&gt;
| 0x1f8f-0x1faa&lt;br /&gt;
| 0x962-0x97d&lt;br /&gt;
| 0x00&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x1fab-0x1fea&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 64 byte sine table for LED flashing&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== WAVEDATA ===&lt;br /&gt;
&lt;br /&gt;
The following data is loaded into WAVEDATA on bootup, and whenever operation 0x7e is performed:&lt;br /&gt;
&lt;br /&gt;
==== Waveform descriptor 0 ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; style=&amp;quot;font-size: smaller;&amp;quot; class=&amp;quot;alternategrey sigroktable&amp;quot;&lt;br /&gt;
!State&lt;br /&gt;
!Length/Branch&lt;br /&gt;
!Opcode&lt;br /&gt;
!Output&lt;br /&gt;
!Logic&lt;br /&gt;
!Operation&lt;br /&gt;
!NEXT&lt;br /&gt;
!DATA&lt;br /&gt;
!CTL2&lt;br /&gt;
!CTL1&lt;br /&gt;
!CTL0&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 0x81&lt;br /&gt;
| 0x01  &lt;br /&gt;
| 0x05  &lt;br /&gt;
| 0x70&lt;br /&gt;
| if FF or RDY0 then 0 (ReExec) else 1&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 0xB8  &lt;br /&gt;
| 0x07  &lt;br /&gt;
| 0x04  &lt;br /&gt;
| 0x2D&lt;br /&gt;
| if TC expired then 7 else 0&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 0x01  &lt;br /&gt;
| 0x02  &lt;br /&gt;
| 0x04  &lt;br /&gt;
| 0x00  &lt;br /&gt;
| Delay 1&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| 0x01  &lt;br /&gt;
| 0x02  &lt;br /&gt;
| 0x04  &lt;br /&gt;
| 0x00  &lt;br /&gt;
| Delay 1&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 0x01  &lt;br /&gt;
| 0x02  &lt;br /&gt;
| 0x04  &lt;br /&gt;
| 0x00  &lt;br /&gt;
| Delay 1&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| 0x01  &lt;br /&gt;
| 0x02  &lt;br /&gt;
| 0x04  &lt;br /&gt;
| 0x00  &lt;br /&gt;
| Delay 1&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| 0x01  &lt;br /&gt;
| 0x02  &lt;br /&gt;
| 0x04  &lt;br /&gt;
| 0x00  &lt;br /&gt;
| Delay 1&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Waveform descriptor 1-3 ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; style=&amp;quot;font-size: smaller;&amp;quot; class=&amp;quot;alternategrey sigroktable&amp;quot;&lt;br /&gt;
!State&lt;br /&gt;
!Length/Branch&lt;br /&gt;
!Opcode&lt;br /&gt;
!Output&lt;br /&gt;
!Logic&lt;br /&gt;
!Operation&lt;br /&gt;
!NEXT&lt;br /&gt;
!DATA&lt;br /&gt;
!CTL2&lt;br /&gt;
!CTL1&lt;br /&gt;
!CTL0&lt;br /&gt;
|-&lt;br /&gt;
| 0-6&lt;br /&gt;
| 0x01&lt;br /&gt;
| 0x00&lt;br /&gt;
| 0x05&lt;br /&gt;
| 0x00&lt;br /&gt;
| Delay 1&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== FPGA variables ==&lt;br /&gt;
&lt;br /&gt;
The following variables can be read and written by the host using operations 0x81 and 0x80:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; style=&amp;quot;font-size: smaller;&amp;quot; class=&amp;quot;alternategrey sigroktable&amp;quot;&lt;br /&gt;
! style=&amp;quot;width: 4em;&amp;quot; | Address&lt;br /&gt;
! style=&amp;quot;width: 3em;&amp;quot; | Bit&lt;br /&gt;
! Contents&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
|&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;FPGA bitstream version&amp;#039;&amp;#039;&amp;#039; (currently 0x10).&lt;br /&gt;
|-&lt;br /&gt;
| 0x01&lt;br /&gt;
|&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Status and control&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| 0&lt;br /&gt;
| Acquisition running&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| 1&lt;br /&gt;
| Update acquisition parameters(?)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| 2&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| 3&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| 4&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| 5&lt;br /&gt;
| FIFO overflow&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| 6&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| 7&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 0x02&lt;br /&gt;
|&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Channel select low&amp;#039;&amp;#039;&amp;#039;. Each 1 bit in this byte enables one of the channels 0-7 for acquisition.&lt;br /&gt;
|-&lt;br /&gt;
| 0x03&lt;br /&gt;
|&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Channel select high&amp;#039;&amp;#039;&amp;#039;. Each 1 bit in this byte enables one of the channels 8-15 for acquisition.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
|&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Sampling rate divisor&amp;#039;&amp;#039;&amp;#039;. Sample rate is the base clock divided by N+1, where N is the value in this register.&lt;br /&gt;
|-&lt;br /&gt;
| 0x05&lt;br /&gt;
|&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;LED brightness&amp;#039;&amp;#039;&amp;#039;. 0 = min (off), 0xff = max, 0x19 = dimmed.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
|&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x07&lt;br /&gt;
|&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
|&lt;br /&gt;
| ? (Read on acquisition stop.)&lt;br /&gt;
|-&lt;br /&gt;
| 0x09&lt;br /&gt;
|&lt;br /&gt;
| ? (Read on acquisition stop.)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0a&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| 0&lt;br /&gt;
| Sampling base clock select: 0 = 100MHz, 1 = 160MHz&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| 1&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| 2&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| 3&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| 4&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| 5&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| 6&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| 7&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 0x0c&lt;br /&gt;
|&lt;br /&gt;
| ?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== EEPROM layout ==&lt;br /&gt;
&lt;br /&gt;
The Saleae Logic16 has a 256-byte I2C EEPROM with the following layout:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;background-color: orange&amp;quot;&amp;gt;c0&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;background-color: lime&amp;quot;&amp;gt;a9 21&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;background-color: green&amp;quot;&amp;gt;01 10&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;background-color: lightgreen&amp;quot;&amp;gt;00 00&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;background-color: brown&amp;quot;&amp;gt;00&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;background-color: yellow&amp;quot;&amp;gt;aa bb cc dd ee ff gg hh&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;background-color: cyan&amp;quot;&amp;gt;xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx&amp;lt;/span&amp;gt;&lt;br /&gt;
 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff&lt;br /&gt;
 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff&lt;br /&gt;
 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff&lt;br /&gt;
 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff&lt;br /&gt;
 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff&lt;br /&gt;
 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff&lt;br /&gt;
 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff&lt;br /&gt;
 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff&lt;br /&gt;
 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff&lt;br /&gt;
 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff&lt;br /&gt;
 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff&lt;br /&gt;
 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff&lt;br /&gt;
 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff&lt;br /&gt;
 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff&lt;br /&gt;
&lt;br /&gt;
Description:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; style=&amp;quot;font-size: smaller;&amp;quot; class=&amp;quot;alternategrey sigroktable&amp;quot;&lt;br /&gt;
!Bytes&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background-color: orange&amp;quot; | 0&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;0xc0&amp;#039;&amp;#039;&amp;#039;: FX2 &amp;quot;c0 load&amp;quot; mode, i.e. VID/PID/DID are loaded from EEPROM (but not firmware).&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background-color: lime&amp;quot; | 1-2&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;0x21a9&amp;#039;&amp;#039;&amp;#039;: USB vendor ID (VID).&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background-color: green&amp;quot; | 3-4&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;0x1001&amp;#039;&amp;#039;&amp;#039;: USB product ID (PID).&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | 5-6&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;0x0000&amp;#039;&amp;#039;&amp;#039;: USB device ID (DID).&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background-color: brown&amp;quot; | 7&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;0x00&amp;#039;&amp;#039;&amp;#039;: FX2 configuration byte (see FX2 TRM for details).&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background-color: yellow&amp;quot; | 8-15&lt;br /&gt;
| A unique device identifier / serial number for this Logic16 (8 bytes).&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background-color: cyan&amp;quot; | 16-31&lt;br /&gt;
| &amp;quot;Magic&amp;quot; values that are different for each Logic16 device (16 bytes).&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Marcus Comstedt</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=Saleae_Logic16/Firmware&amp;diff=9449</id>
		<title>Saleae Logic16/Firmware</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=Saleae_Logic16/Firmware&amp;diff=9449"/>
		<updated>2014-08-17T12:15:13Z</updated>

		<summary type="html">&lt;p&gt;Marcus Comstedt: /* FPGA variables */ Document FIFO overflow bit&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The following information is related to the vendor firmware included with the version 1.1.15 of the vendor application &amp;quot;Logic&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Interrupt handlers ==&lt;br /&gt;
&lt;br /&gt;
The following interrupt handlers are installed. If the address is absent, it means the handler just returns (RETI) without performing any action.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; style=&amp;quot;font-size: smaller;&amp;quot; class=&amp;quot;alternategrey sigroktable&amp;quot;&lt;br /&gt;
!Handler&lt;br /&gt;
!Address&lt;br /&gt;
|-&lt;br /&gt;
| RESET&lt;br /&gt;
| 0x0000&lt;br /&gt;
|-&lt;br /&gt;
| TF2&lt;br /&gt;
| 0x0e65&lt;br /&gt;
|-&lt;br /&gt;
| RESUME&lt;br /&gt;
| 0x002e&lt;br /&gt;
|-&lt;br /&gt;
| SUDAV&lt;br /&gt;
| 0x0ae8&lt;br /&gt;
|-&lt;br /&gt;
| SOF&lt;br /&gt;
| 0x13d2&lt;br /&gt;
|-&lt;br /&gt;
| SUTOK&lt;br /&gt;
| 0x13bf&lt;br /&gt;
|-&lt;br /&gt;
| SUSPEND&lt;br /&gt;
| 0x13aa&lt;br /&gt;
|-&lt;br /&gt;
| USB_RESET&lt;br /&gt;
| 0x130b&lt;br /&gt;
|-&lt;br /&gt;
| HISPEED&lt;br /&gt;
| 0x12df&lt;br /&gt;
|-&lt;br /&gt;
| EP0ACK&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| EP0_IN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| EP0_OUT&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| EP1_IN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| EP1_OUT&lt;br /&gt;
| 0x115d&lt;br /&gt;
|-&lt;br /&gt;
| EP2&lt;br /&gt;
| 0x11a2&lt;br /&gt;
|-&lt;br /&gt;
| EP4&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| EP6&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| EP8&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| IBN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| EP0PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| EP1PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| EP2PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| EP4PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| EP6PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| EP8PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| ERRLIMIT&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| EP2ISOERR&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| EP4ISOERRF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| EP6ISOERR&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| EP8ISOERRF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| EP2PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| EP4PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| EP6PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| EP8PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| EP2EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| EP4EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| EP6EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| EP8EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| EP2FF&lt;br /&gt;
| 0x11e7&lt;br /&gt;
|-&lt;br /&gt;
| EP4FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| EP6FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| EP8FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| GPIFDONE&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| GPIFWF&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Endpoint 1 OUT (EP1_OUT) handler ===&lt;br /&gt;
&lt;br /&gt;
After decrypting the OUT packet, processing of the packet proceeds depending on the first byte of the packet, which selects the operation. After the operation, any resulting IN packet will be encrypted before submitting it to the host.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; style=&amp;quot;font-size: smaller;&amp;quot; class=&amp;quot;alternategrey sigroktable&amp;quot;&lt;br /&gt;
!Byte&lt;br /&gt;
!Handler&lt;br /&gt;
!Operation&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 0x14f&lt;br /&gt;
| Configure endpoints for quad-buffered bulk FIFO operation, and trigger a GPIF read on EP2.&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 0x157&lt;br /&gt;
| Abort the GPIF.&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| 0x15f&lt;br /&gt;
| Write data to EEPROM with I²C address 1010000 (0x50) in single byte addressing mode. The second and third byte contain a fixed magic cookie of &amp;#039;&amp;#039;&amp;#039;0x42 0x55&amp;#039;&amp;#039;&amp;#039;. The fourth byte contains the single byte address. The fifth byte contains the number of bytes to write (1-58). The rest of the packet contains the data to write.&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| 0x1b3&lt;br /&gt;
| Read data from EEPROM with I²C address 1010000 (0x50) in single byte addressing mode. The second and third byte contain a fixed magic cookie of &amp;#039;&amp;#039;&amp;#039;0x33 0x81&amp;#039;&amp;#039;&amp;#039;. The fourth byte contains the single byte address. The fifth byte contains the number of bytes to read (1-64). The data will be available as an IN transfer.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7a&lt;br /&gt;
| 0x309&lt;br /&gt;
| Upload the sine table for LED flashing. The second byte contains the offset to start writing at, and the third byte the number of bytes to write. A maximum of 61 bytes can be uploaded per packet, so two packets are needed to write the entire table.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7b&lt;br /&gt;
| 0x346&lt;br /&gt;
| Enable or disable LED flashing. The second byte of the packet is a bool indicating if LED flashing should be enabled. The following bytes are only used if LED flashing is enabled, but are always transmitted. If flashing is enabled, the LED brighness will periodically be set from the sine table. Byte 3 and 4 of the packet are the Timer 2 reload value, in little endian format. Byte 5 is a software clock divisor. The pointer in the sine table will be advanced by one every &amp;#039;&amp;#039;&amp;#039;(0x10000 - RELOAD) * (DIV + 1) / 4000000&amp;#039;&amp;#039;&amp;#039; seconds. Byte 6 is a boolean indicating whether to repeat the waveform (1) or stop at the end of the first period (0).&lt;br /&gt;
|-&lt;br /&gt;
| 0x7c&lt;br /&gt;
| 0x282&lt;br /&gt;
| Re-renumerate; return control to the builtin bootloader.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7d&lt;br /&gt;
| 0x2aa&lt;br /&gt;
| Abort the GPIF. The second byte of the packet is returned complemented in an IN transfer, as acknowledgement.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7e&lt;br /&gt;
| 0x2cf&lt;br /&gt;
| Disable LED flashing, configure the GPIF, and prepare the FPGA for bitstream upload by pulsing &amp;#039;&amp;#039;&amp;#039;PROG_B&amp;#039;&amp;#039;&amp;#039; and then waiting for &amp;#039;&amp;#039;&amp;#039;INIT_B&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7f&lt;br /&gt;
| 0x2e4&lt;br /&gt;
| Disable LED flashing, transmit N (1-62) bytes of bitstream on the FPGA &amp;#039;&amp;#039;&amp;#039;DIN&amp;#039;&amp;#039;&amp;#039; pin, clocked by &amp;#039;&amp;#039;&amp;#039;CCLK&amp;#039;&amp;#039;&amp;#039;. The second byte of the packet encodes N.&lt;br /&gt;
|-&lt;br /&gt;
| 0x80&lt;br /&gt;
| 0x205&lt;br /&gt;
| Transmit N (1-31) 16-bit words to the FPGA. The second byte of the packet encodes N. Data is sent on &amp;#039;&amp;#039;&amp;#039;PA6&amp;#039;&amp;#039;&amp;#039;, MSB-first, with rising edges of &amp;#039;&amp;#039;&amp;#039;PA5&amp;#039;&amp;#039;&amp;#039; to clock the bits out. During each word transfer, &amp;#039;&amp;#039;&amp;#039;PA4&amp;#039;&amp;#039;&amp;#039; is held low. The most significant bit (b15) of each word must be 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x81&lt;br /&gt;
| 0x23b&lt;br /&gt;
| Perform N (1-31) write-read transactions to the FPGA. The second byte of the packet encodes N. Each transaction consists of 8 bits (from the out packet) being transmitted on &amp;#039;&amp;#039;&amp;#039;PA6&amp;#039;&amp;#039;&amp;#039;, like for the 0x80 operation above, and then 8 bits being received on &amp;#039;&amp;#039;&amp;#039;PA7&amp;#039;&amp;#039;&amp;#039;. N bytes will be available for an IN transfer afterwards. The most significant bit (b7) of each byte to send must be 0, but is actually transmitted as a 1 (to indicate read operation). &amp;#039;&amp;#039;&amp;#039;PA7&amp;#039;&amp;#039;&amp;#039; is polled immediately after the falling edge of &amp;#039;&amp;#039;&amp;#039;PA5&amp;#039;&amp;#039;&amp;#039;. &amp;#039;&amp;#039;&amp;#039;PA4&amp;#039;&amp;#039;&amp;#039; is held low during each write-read transaction.&lt;br /&gt;
|-&lt;br /&gt;
| 0x82&lt;br /&gt;
| 0x3a3&lt;br /&gt;
| Read the REVID register. 16 bits of &amp;#039;&amp;#039;&amp;#039;REVID&amp;#039;&amp;#039;&amp;#039; data will be available for an IN transfer.&lt;br /&gt;
|-&lt;br /&gt;
| others&lt;br /&gt;
| 0x3c7&lt;br /&gt;
| Do nothing&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Command 0x7e waveform ====&lt;br /&gt;
&lt;br /&gt;
[[File:Logic16 FW Command 0x7e Waveform.svg]]&lt;br /&gt;
&lt;br /&gt;
==== Command 0x7f waveform ====&lt;br /&gt;
&lt;br /&gt;
[[File:Logic16 FW Command 0x7f Waveform.svg]]&lt;br /&gt;
&lt;br /&gt;
==== Command 0x80 waveform ====&lt;br /&gt;
&lt;br /&gt;
[[File:Logic16 FW Command 0x80 Waveform.svg]]&lt;br /&gt;
&lt;br /&gt;
==== Command 0x81 waveform ====&lt;br /&gt;
&lt;br /&gt;
[[File:Logic16 FW Command 0x81 Waveform.svg]]&lt;br /&gt;
&lt;br /&gt;
== XDATA variables ==&lt;br /&gt;
&lt;br /&gt;
The following variables are stored in the 8K &amp;quot;external&amp;quot; code/data memory, after the firmware code.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; style=&amp;quot;font-size: smaller;&amp;quot; class=&amp;quot;alternategrey sigroktable&amp;quot;&lt;br /&gt;
!rowspan=&amp;quot;2&amp;quot;|Address&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Init data in FW&lt;br /&gt;
!rowspan=&amp;quot;2&amp;quot;|Contents&lt;br /&gt;
|-&lt;br /&gt;
!Address&lt;br /&gt;
!Value&lt;br /&gt;
|-&lt;br /&gt;
| 0x1f00-0x1f7f&lt;br /&gt;
| 0x8d6-0x955&lt;br /&gt;
|&lt;br /&gt;
| WAVEDATA&lt;br /&gt;
|-&lt;br /&gt;
| 0x1f80&lt;br /&gt;
| 0x981&lt;br /&gt;
| 0xe0&lt;br /&gt;
| GPIFREADYCFG&lt;br /&gt;
|-&lt;br /&gt;
| 0x1f81&lt;br /&gt;
| 0x982&lt;br /&gt;
| 0x10&lt;br /&gt;
| GPIFCTLCFG&lt;br /&gt;
|-&lt;br /&gt;
| 0x1f82&lt;br /&gt;
| 0x983&lt;br /&gt;
| 0x00&lt;br /&gt;
| GPIFIDLECS&lt;br /&gt;
|-&lt;br /&gt;
| 0x1f83&lt;br /&gt;
| 0x984&lt;br /&gt;
| 0x05&lt;br /&gt;
| GPIFIDLECTL&lt;br /&gt;
|-&lt;br /&gt;
| 0x1f84&lt;br /&gt;
| 0x985&lt;br /&gt;
| 0xee&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x1f85&lt;br /&gt;
| 0x986&lt;br /&gt;
| 0x50&lt;br /&gt;
| GPIFWFSELECT&lt;br /&gt;
|-&lt;br /&gt;
| 0x1f86&lt;br /&gt;
| 0x987&lt;br /&gt;
| 0x00&lt;br /&gt;
| GPIFREADYSTAT&lt;br /&gt;
|-&lt;br /&gt;
| 0x1f87&lt;br /&gt;
| 0x95a&lt;br /&gt;
| 0x00&lt;br /&gt;
| FLOWSTATE&lt;br /&gt;
|-&lt;br /&gt;
| 0x1f88&lt;br /&gt;
| 0x95b&lt;br /&gt;
| 0x00&lt;br /&gt;
| FLOWLOGIC&lt;br /&gt;
|-&lt;br /&gt;
| 0x1f89&lt;br /&gt;
| 0x95c&lt;br /&gt;
| 0x00&lt;br /&gt;
| FLOWEQ0CTL&lt;br /&gt;
|-&lt;br /&gt;
| 0x1f8a&lt;br /&gt;
| 0x95d&lt;br /&gt;
| 0x00&lt;br /&gt;
| FLOWEQ1CTL&lt;br /&gt;
|-&lt;br /&gt;
| 0x1f8b&lt;br /&gt;
| 0x95e&lt;br /&gt;
| 0x00&lt;br /&gt;
| FLOWHOLDOFF&lt;br /&gt;
|-&lt;br /&gt;
| 0x1f8c&lt;br /&gt;
| 0x95f&lt;br /&gt;
| 0x00&lt;br /&gt;
| FLOWSTB&lt;br /&gt;
|-&lt;br /&gt;
| 0x1f8d&lt;br /&gt;
| 0x960&lt;br /&gt;
| 0x00&lt;br /&gt;
| FLOWSTBEDGE&lt;br /&gt;
|-&lt;br /&gt;
| 0x1f8e&lt;br /&gt;
| 0x961&lt;br /&gt;
| 0x00&lt;br /&gt;
| FLOWSTBHPERIOD&lt;br /&gt;
|-&lt;br /&gt;
| 0x1f8f-0x1faa&lt;br /&gt;
| 0x962-0x97d&lt;br /&gt;
| 0x00&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x1fab-0x1fea&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 64 byte sine table for LED flashing&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== WAVEDATA ===&lt;br /&gt;
&lt;br /&gt;
The following data is loaded into WAVEDATA on bootup, and whenever operation 0x7e is performed:&lt;br /&gt;
&lt;br /&gt;
==== Waveform descriptor 0 ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; style=&amp;quot;font-size: smaller;&amp;quot; class=&amp;quot;alternategrey sigroktable&amp;quot;&lt;br /&gt;
!State&lt;br /&gt;
!Length/Branch&lt;br /&gt;
!Opcode&lt;br /&gt;
!Output&lt;br /&gt;
!Logic&lt;br /&gt;
!Operation&lt;br /&gt;
!NEXT&lt;br /&gt;
!DATA&lt;br /&gt;
!CTL2&lt;br /&gt;
!CTL1&lt;br /&gt;
!CTL0&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 0x81&lt;br /&gt;
| 0x01  &lt;br /&gt;
| 0x05  &lt;br /&gt;
| 0x70&lt;br /&gt;
| if FF or RDY0 then 0 (ReExec) else 1&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 0xB8  &lt;br /&gt;
| 0x07  &lt;br /&gt;
| 0x04  &lt;br /&gt;
| 0x2D&lt;br /&gt;
| if TC expired then 7 else 0&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 0x01  &lt;br /&gt;
| 0x02  &lt;br /&gt;
| 0x04  &lt;br /&gt;
| 0x00  &lt;br /&gt;
| Delay 1&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| 0x01  &lt;br /&gt;
| 0x02  &lt;br /&gt;
| 0x04  &lt;br /&gt;
| 0x00  &lt;br /&gt;
| Delay 1&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 0x01  &lt;br /&gt;
| 0x02  &lt;br /&gt;
| 0x04  &lt;br /&gt;
| 0x00  &lt;br /&gt;
| Delay 1&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| 0x01  &lt;br /&gt;
| 0x02  &lt;br /&gt;
| 0x04  &lt;br /&gt;
| 0x00  &lt;br /&gt;
| Delay 1&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| 0x01  &lt;br /&gt;
| 0x02  &lt;br /&gt;
| 0x04  &lt;br /&gt;
| 0x00  &lt;br /&gt;
| Delay 1&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Waveform descriptor 1-3 ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; style=&amp;quot;font-size: smaller;&amp;quot; class=&amp;quot;alternategrey sigroktable&amp;quot;&lt;br /&gt;
!State&lt;br /&gt;
!Length/Branch&lt;br /&gt;
!Opcode&lt;br /&gt;
!Output&lt;br /&gt;
!Logic&lt;br /&gt;
!Operation&lt;br /&gt;
!NEXT&lt;br /&gt;
!DATA&lt;br /&gt;
!CTL2&lt;br /&gt;
!CTL1&lt;br /&gt;
!CTL0&lt;br /&gt;
|-&lt;br /&gt;
| 0-6&lt;br /&gt;
| 0x01&lt;br /&gt;
| 0x00&lt;br /&gt;
| 0x05&lt;br /&gt;
| 0x00&lt;br /&gt;
| Delay 1&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== FPGA variables ==&lt;br /&gt;
&lt;br /&gt;
The following variables can be read and written by the host using operations 0x81 and 0x80:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; style=&amp;quot;font-size: smaller;&amp;quot; class=&amp;quot;alternategrey sigroktable&amp;quot;&lt;br /&gt;
! Address&lt;br /&gt;
! Contents&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;FPGA bitstream version&amp;#039;&amp;#039;&amp;#039; (currently 0x10).&lt;br /&gt;
|-&lt;br /&gt;
| 0x01&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Status and control&amp;#039;&amp;#039;&amp;#039;. Bit 0 = acquisition running. Bit 1 = update acquisition parameters(?). Bit 3 = ?. Bit 5 = FIFO overflow. Bit 6 = ?.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Channel select low&amp;#039;&amp;#039;&amp;#039;. Each 1 bit in this byte enables one of the channels 0-7 for acquisition.&lt;br /&gt;
|-&lt;br /&gt;
| 0x03&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Channel select high&amp;#039;&amp;#039;&amp;#039;. Each 1 bit in this byte enables one of the channels 8-15 for acquisition.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Sampling rate divisor&amp;#039;&amp;#039;&amp;#039;. Sample rate is the base clock divided by N+1, where N is the value in this register.&lt;br /&gt;
|-&lt;br /&gt;
| 0x05&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;LED brightness&amp;#039;&amp;#039;&amp;#039;. 0 = min (off), 0xff = max, 0x19 = dimmed.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x07&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| ? (Read on acquisition stop.)&lt;br /&gt;
|-&lt;br /&gt;
| 0x09&lt;br /&gt;
| ? (Read on acquisition stop.)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0a&lt;br /&gt;
| Bit 7 = ?. Bit 6 = ?. Bit 0 = Sampling base clock select: 0 = 100MHz, 1 = 160MHz.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0c&lt;br /&gt;
| ?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== EEPROM layout ==&lt;br /&gt;
&lt;br /&gt;
The Saleae Logic16 has a 256-byte I2C EEPROM with the following layout:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;background-color: orange&amp;quot;&amp;gt;c0&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;background-color: lime&amp;quot;&amp;gt;a9 21&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;background-color: green&amp;quot;&amp;gt;01 10&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;background-color: lightgreen&amp;quot;&amp;gt;00 00&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;background-color: brown&amp;quot;&amp;gt;00&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;background-color: yellow&amp;quot;&amp;gt;aa bb cc dd ee ff gg hh&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;background-color: cyan&amp;quot;&amp;gt;xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx&amp;lt;/span&amp;gt;&lt;br /&gt;
 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff&lt;br /&gt;
 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff&lt;br /&gt;
 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff&lt;br /&gt;
 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff&lt;br /&gt;
 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff&lt;br /&gt;
 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff&lt;br /&gt;
 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff&lt;br /&gt;
 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff&lt;br /&gt;
 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff&lt;br /&gt;
 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff&lt;br /&gt;
 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff&lt;br /&gt;
 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff&lt;br /&gt;
 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff&lt;br /&gt;
 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff&lt;br /&gt;
&lt;br /&gt;
Description:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; style=&amp;quot;font-size: smaller;&amp;quot; class=&amp;quot;alternategrey sigroktable&amp;quot;&lt;br /&gt;
!Bytes&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background-color: orange&amp;quot; | 0&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;0xc0&amp;#039;&amp;#039;&amp;#039;: FX2 &amp;quot;c0 load&amp;quot; mode, i.e. VID/PID/DID are loaded from EEPROM (but not firmware).&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background-color: lime&amp;quot; | 1-2&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;0x21a9&amp;#039;&amp;#039;&amp;#039;: USB vendor ID (VID).&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background-color: green&amp;quot; | 3-4&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;0x1001&amp;#039;&amp;#039;&amp;#039;: USB product ID (PID).&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | 5-6&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;0x0000&amp;#039;&amp;#039;&amp;#039;: USB device ID (DID).&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background-color: brown&amp;quot; | 7&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;0x00&amp;#039;&amp;#039;&amp;#039;: FX2 configuration byte (see FX2 TRM for details).&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background-color: yellow&amp;quot; | 8-15&lt;br /&gt;
| A unique device identifier / serial number for this Logic16 (8 bytes).&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background-color: cyan&amp;quot; | 16-31&lt;br /&gt;
| &amp;quot;Magic&amp;quot; values that are different for each Logic16 device (16 bytes).&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Marcus Comstedt</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=Saleae_Logic16/Firmware&amp;diff=6967</id>
		<title>Saleae Logic16/Firmware</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=Saleae_Logic16/Firmware&amp;diff=6967"/>
		<updated>2013-08-05T12:28:37Z</updated>

		<summary type="html">&lt;p&gt;Marcus Comstedt: /* FPGA variables */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The following information is related to the vendor firmware included with the&lt;br /&gt;
version 1.1.15 of the vendor application &amp;quot;Logic&amp;quot;.&lt;br /&gt;
== Interrupt handlers ==&lt;br /&gt;
The following interrupt handlers are installed.  If the address is absent, it means the handler just returns (RETI) without performing any action.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|RESET&lt;br /&gt;
|0x0000&lt;br /&gt;
|-&lt;br /&gt;
|TF2&lt;br /&gt;
|0x0e65&lt;br /&gt;
|-&lt;br /&gt;
|RESUME&lt;br /&gt;
|0x002e&lt;br /&gt;
|-&lt;br /&gt;
|SUDAV&lt;br /&gt;
|0x0ae8&lt;br /&gt;
|-&lt;br /&gt;
|SOF&lt;br /&gt;
|0x13d2&lt;br /&gt;
|-&lt;br /&gt;
|SUTOK&lt;br /&gt;
|0x13bf&lt;br /&gt;
|-&lt;br /&gt;
|SUSPEND&lt;br /&gt;
|0x13aa&lt;br /&gt;
|-&lt;br /&gt;
|USB_RESET&lt;br /&gt;
|0x130b&lt;br /&gt;
|-&lt;br /&gt;
|HISPEED&lt;br /&gt;
|0x12df&lt;br /&gt;
|-&lt;br /&gt;
|EP0ACK&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP0_IN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP0_OUT&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP1_IN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP1_OUT&lt;br /&gt;
|0x115d&lt;br /&gt;
|-&lt;br /&gt;
|EP2&lt;br /&gt;
|0x11a2&lt;br /&gt;
|-&lt;br /&gt;
|EP4&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|IBN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP0PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP1PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|ERRLIMIT&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2ISOERR&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4ISOERRF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6ISOERR&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8ISOERRF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2FF&lt;br /&gt;
|0x11e7&lt;br /&gt;
|-&lt;br /&gt;
|EP4FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|GPIFDONE&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|GPIFWF&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Endpoint 1 OUT (EP1_OUT) handler ===&lt;br /&gt;
&lt;br /&gt;
After decrypting the OUT packet, processing of the packet proceeds depending on the first byte of the packet, which selects the operation.  After the operation, any resulting IN packet will be encrypted before submitting it to the host.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Byte&lt;br /&gt;
! Handler&lt;br /&gt;
! Operation&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 0x14f&lt;br /&gt;
| Configure endpoints for quad-buffered bulk FIFO operation, and trigger a GPIF read on EP2.&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 0x157&lt;br /&gt;
| Abort the GPIF.&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| 0x15f&lt;br /&gt;
| Write data to EEPROM with I²C address 1010000 (single addressing mode).  The second and third byte contain a fixed magic cookie of 0x42 0x55.  The fourth byte contains the single byte address.  The fifth byte contains the number of bytes to write (1-58).  The rest of the packet contains the data to write.&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| 0x1b3&lt;br /&gt;
| Read data from EEPROM with I²C address 1010000 (single byte addressing mode).  The second and third byte contain a fixed magic cookie of 0x33 0x81.  The fourth byte contains the single byte address.  The fifth byte contains the number of bytes to read (1-64). The data will be available as an IN transfer.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7a&lt;br /&gt;
| 0x309&lt;br /&gt;
| Upload the sine table for LED flashing.  The second byte contains the offset to start writing at, and the third byte the number of bytes to write.  A maximum of 61 bytes can be uploaded per packet, so two packets are needed to write the entire table.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7b&lt;br /&gt;
| 0x346&lt;br /&gt;
| Enable or disable LED flashing.  The second byte of the packet is a bool indicating if LED flashing should be enabled.  The following bytes are only used if LED flashing is enabled, but are always transmitted.  If flashing is enabled, the LED brighness will periodically be set from the sine table.  Byte 3 and 4 of the packet are the Timer 2 reload value, in little endian format.  Byte 5 is a software clock divisor.  The pointer in the sine table will be advanced by one every (0x10000-RELOAD)*(DIV+1)/4000000 seconds.  Byte 6 is a boolean indicating whether to repeat the waveform (1) or stop at the end of the first period (0).&lt;br /&gt;
|-&lt;br /&gt;
| 0x7c&lt;br /&gt;
| 0x282&lt;br /&gt;
| Re-renumerate; return control to the builtin bootloader.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7d&lt;br /&gt;
| 0x2aa&lt;br /&gt;
| Abort the GPIF.  The second byte of the packet is returned complemented in an IN transfer, as acknowledgement.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7e&lt;br /&gt;
| 0x2cf&lt;br /&gt;
| Disable LED flashing, configure the GPIF, and prepare the FPGA for bitstream upload by pulsing PROG_B and then waiting for INIT_B.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7f&lt;br /&gt;
| 0x2e4&lt;br /&gt;
| Disable LED flashing, transmit N (1-62) bytes of bitstream on the FPGA DIN pin, clocked by CCLK.  The second byte of the packet encodes N.&lt;br /&gt;
|-&lt;br /&gt;
| 0x80&lt;br /&gt;
| 0x205&lt;br /&gt;
| Transmit N (1-31) 16-bit words to the FPGA.  The second byte of the packet encodes N. Data is sent on PA6, MSB first, with rising edges of PA5 to clock the bits out. During each word transfer, PA4 is held low.  The most significant bit (b15) of each word must be 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x81&lt;br /&gt;
| 0x23b&lt;br /&gt;
| Perform N (1-31) write-read transactions to the FPGA.  The second byte of the packet encodes N.  Each transaction consists of 8 bits (from the out packet) being transmitted on PA6, like for the 0x80 operation above, and then 8 bits being received on PA7.  N bytes will be available for an IN transfer afterwards.  The most significant bit (b7) of each byte to send must be 0, but is actually transmitted as a 1 (to indicate read operation).  PA7 is polled immediately after the falling edge of PA5.  PA4 is held low during each write-read transaction.&lt;br /&gt;
|-&lt;br /&gt;
| 0x82&lt;br /&gt;
| 0x3a3&lt;br /&gt;
| Read the REVID register.  16 bits of REVID data will be available for an IN transfer.&lt;br /&gt;
|-&lt;br /&gt;
| others&lt;br /&gt;
| 0x3c7&lt;br /&gt;
| Do nothing&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Command 0x7e waveform ====&lt;br /&gt;
[[File:Logic16 FW Command 0x7e Waveform.svg]]&lt;br /&gt;
==== Command 0x7f waveform ====&lt;br /&gt;
[[File:Logic16 FW Command 0x7f Waveform.svg]]&lt;br /&gt;
==== Command 0x80 waveform ====&lt;br /&gt;
[[File:Logic16 FW Command 0x80 Waveform.svg]]&lt;br /&gt;
==== Command 0x81 waveform ====&lt;br /&gt;
[[File:Logic16 FW Command 0x81 Waveform.svg]]&lt;br /&gt;
&lt;br /&gt;
== XDATA variables ==&lt;br /&gt;
The following variables are stored in the 8K &amp;quot;external&amp;quot; code/data memory, after the firmware code.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!rowspan=&amp;quot;2&amp;quot;|Address&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Init data in FW&lt;br /&gt;
!rowspan=&amp;quot;2&amp;quot;|Contents&lt;br /&gt;
|-&lt;br /&gt;
!Address&lt;br /&gt;
!Value&lt;br /&gt;
|-&lt;br /&gt;
|0x1f00-0x1f7f&lt;br /&gt;
|0x8d6-0x955&lt;br /&gt;
|&lt;br /&gt;
|WAVEDATA&lt;br /&gt;
|-&lt;br /&gt;
|0x1f80&lt;br /&gt;
|0x981&lt;br /&gt;
|0xe0&lt;br /&gt;
|GPIFREADYCFG&lt;br /&gt;
|-&lt;br /&gt;
|0x1f81&lt;br /&gt;
|0x982&lt;br /&gt;
|0x10&lt;br /&gt;
|GPIFCTLCFG&lt;br /&gt;
|-&lt;br /&gt;
|0x1f82&lt;br /&gt;
|0x983&lt;br /&gt;
|0x00&lt;br /&gt;
|GPIFIDLECS&lt;br /&gt;
|-&lt;br /&gt;
|0x1f83&lt;br /&gt;
|0x984&lt;br /&gt;
|0x05&lt;br /&gt;
|GPIFIDLECTL&lt;br /&gt;
|-&lt;br /&gt;
|0x1f84&lt;br /&gt;
|0x985&lt;br /&gt;
|0xee&lt;br /&gt;
|?&lt;br /&gt;
|-&lt;br /&gt;
|0x1f85&lt;br /&gt;
|0x986&lt;br /&gt;
|0x50&lt;br /&gt;
|GPIFWFSELECT&lt;br /&gt;
|-&lt;br /&gt;
|0x1f86&lt;br /&gt;
|0x987&lt;br /&gt;
|0x00&lt;br /&gt;
|GPIFREADYSTAT&lt;br /&gt;
|-&lt;br /&gt;
|0x1f87&lt;br /&gt;
|0x95a&lt;br /&gt;
|0x00&lt;br /&gt;
|FLOWSTATE&lt;br /&gt;
|-&lt;br /&gt;
|0x1f88&lt;br /&gt;
|0x95b&lt;br /&gt;
|0x00&lt;br /&gt;
|FLOWLOGIC&lt;br /&gt;
|-&lt;br /&gt;
|0x1f89&lt;br /&gt;
|0x95c&lt;br /&gt;
|0x00&lt;br /&gt;
|FLOWEQ0CTL&lt;br /&gt;
|-&lt;br /&gt;
|0x1f8a&lt;br /&gt;
|0x95d&lt;br /&gt;
|0x00&lt;br /&gt;
|FLOWEQ1CTL&lt;br /&gt;
|-&lt;br /&gt;
|0x1f8b&lt;br /&gt;
|0x95e&lt;br /&gt;
|0x00&lt;br /&gt;
|FLOWHOLDOFF&lt;br /&gt;
|-&lt;br /&gt;
|0x1f8c&lt;br /&gt;
|0x95f&lt;br /&gt;
|0x00&lt;br /&gt;
|FLOWSTB&lt;br /&gt;
|-&lt;br /&gt;
|0x1f8d&lt;br /&gt;
|0x960&lt;br /&gt;
|0x00&lt;br /&gt;
|FLOWSTBEDGE&lt;br /&gt;
|-&lt;br /&gt;
|0x1f8e&lt;br /&gt;
|0x961&lt;br /&gt;
|0x00&lt;br /&gt;
|FLOWSTBHPERIOD&lt;br /&gt;
|-&lt;br /&gt;
|0x1f8f-0x1faa&lt;br /&gt;
|0x962-0x97d&lt;br /&gt;
|0x00&lt;br /&gt;
|?&lt;br /&gt;
|-&lt;br /&gt;
|0x1fab-0x1fea&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|64 byte sine table for LED flashing&lt;br /&gt;
|}&lt;br /&gt;
=== WAVEDATA ===&lt;br /&gt;
The following data is loaded into WAVEDATA on bootup, and whenever operation 0x7e is performed:&lt;br /&gt;
==== Waveform descriptor 0 ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!State&lt;br /&gt;
!Length/Branch&lt;br /&gt;
!Opcode&lt;br /&gt;
!Output&lt;br /&gt;
!Logic&lt;br /&gt;
!Operation&lt;br /&gt;
!NEXT&lt;br /&gt;
!DATA&lt;br /&gt;
!CTL2&lt;br /&gt;
!CTL1&lt;br /&gt;
!CTL0&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|0x81&lt;br /&gt;
|0x01  &lt;br /&gt;
|0x05  &lt;br /&gt;
|0x70&lt;br /&gt;
|if FF or RDY0 then 0 (ReExec) else 1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|0xB8  &lt;br /&gt;
|0x07  &lt;br /&gt;
|0x04  &lt;br /&gt;
|0x2D&lt;br /&gt;
|if TC expired then 7 else 0&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|0x01  &lt;br /&gt;
|0x02  &lt;br /&gt;
|0x04  &lt;br /&gt;
|0x00  &lt;br /&gt;
|Delay 1&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|0x01  &lt;br /&gt;
|0x02  &lt;br /&gt;
|0x04  &lt;br /&gt;
|0x00  &lt;br /&gt;
|Delay 1&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|0x01  &lt;br /&gt;
|0x02  &lt;br /&gt;
|0x04  &lt;br /&gt;
|0x00  &lt;br /&gt;
|Delay 1&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|5&lt;br /&gt;
|0x01  &lt;br /&gt;
|0x02  &lt;br /&gt;
|0x04  &lt;br /&gt;
|0x00  &lt;br /&gt;
|Delay 1&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|6&lt;br /&gt;
|0x01  &lt;br /&gt;
|0x02  &lt;br /&gt;
|0x04  &lt;br /&gt;
|0x00  &lt;br /&gt;
|Delay 1&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Waveform descriptor 1-3 ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!State&lt;br /&gt;
!Length/Branch&lt;br /&gt;
!Opcode&lt;br /&gt;
!Output&lt;br /&gt;
!Logic&lt;br /&gt;
!Operation&lt;br /&gt;
!NEXT&lt;br /&gt;
!DATA&lt;br /&gt;
!CTL2&lt;br /&gt;
!CTL1&lt;br /&gt;
!CTL0&lt;br /&gt;
|-&lt;br /&gt;
|0-6&lt;br /&gt;
|0x01&lt;br /&gt;
|0x00&lt;br /&gt;
|0x05&lt;br /&gt;
|0x00&lt;br /&gt;
|Delay 1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== FPGA variables ==&lt;br /&gt;
The following variables can be read and written by the host using operations 0x81 and 0x80:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Address&lt;br /&gt;
! Contents&lt;br /&gt;
|-&lt;br /&gt;
|0x00&lt;br /&gt;
|FPGA bitstream version (currently 0x10)&lt;br /&gt;
|-&lt;br /&gt;
|0x01&lt;br /&gt;
|Status and control.  Bit 0 = acquisition running.  Bit 1 = update acquisition parameters(?).  Bit 3 = ?.  Bit 6 = ?.&lt;br /&gt;
|-&lt;br /&gt;
|0x02&lt;br /&gt;
|Channel select low.  Each 1 bit in this byte enables one of the channels 0-7 for acquisition.&lt;br /&gt;
|-&lt;br /&gt;
|0x03&lt;br /&gt;
|Channel select high.  Each 1 bit in this byte enables one of the channels 8-15 for acquisition.&lt;br /&gt;
|-&lt;br /&gt;
|0x04&lt;br /&gt;
|Sampling rate divisor.  Sample rate is the base clock divided by N+1, where N is the value in this register.&lt;br /&gt;
|-&lt;br /&gt;
|0x05&lt;br /&gt;
|LED brightness.  0 = min (off), 0xff = max, 0x19 = dimmed.&lt;br /&gt;
|-&lt;br /&gt;
|0x06&lt;br /&gt;
|?&lt;br /&gt;
|-&lt;br /&gt;
|0x07&lt;br /&gt;
|?&lt;br /&gt;
|-&lt;br /&gt;
|0x08&lt;br /&gt;
|? (Read on acquisition stop.)&lt;br /&gt;
|-&lt;br /&gt;
|0x09&lt;br /&gt;
|? (Read on acquisition stop.)&lt;br /&gt;
|-&lt;br /&gt;
|0x0a&lt;br /&gt;
|Bit 7 = ?.  Bit 6 = ?.  Bit 0 = Sampling base clock select: 0 = 100MHz, 1 = 160MHz&lt;br /&gt;
|-&lt;br /&gt;
|0x0c&lt;br /&gt;
|?&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Marcus Comstedt</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=Saleae_Logic16/Firmware&amp;diff=6907</id>
		<title>Saleae Logic16/Firmware</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=Saleae_Logic16/Firmware&amp;diff=6907"/>
		<updated>2013-07-31T21:34:13Z</updated>

		<summary type="html">&lt;p&gt;Marcus Comstedt: /* Endpoint 1 OUT (EP1_OUT) handler */  Explain operations 2 and 6.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The following information is related to the vendor firmware included with the&lt;br /&gt;
version 1.1.15 of the vendor application &amp;quot;Logic&amp;quot;.&lt;br /&gt;
== Interrupt handlers ==&lt;br /&gt;
The following interrupt handlers are installed.  If the address is absent, it means the handler just returns (RETI) without performing any action.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|RESET&lt;br /&gt;
|0x0000&lt;br /&gt;
|-&lt;br /&gt;
|TF2&lt;br /&gt;
|0x0e65&lt;br /&gt;
|-&lt;br /&gt;
|RESUME&lt;br /&gt;
|0x002e&lt;br /&gt;
|-&lt;br /&gt;
|SUDAV&lt;br /&gt;
|0x0ae8&lt;br /&gt;
|-&lt;br /&gt;
|SOF&lt;br /&gt;
|0x13d2&lt;br /&gt;
|-&lt;br /&gt;
|SUTOK&lt;br /&gt;
|0x13bf&lt;br /&gt;
|-&lt;br /&gt;
|SUSPEND&lt;br /&gt;
|0x13aa&lt;br /&gt;
|-&lt;br /&gt;
|USB_RESET&lt;br /&gt;
|0x130b&lt;br /&gt;
|-&lt;br /&gt;
|HISPEED&lt;br /&gt;
|0x12df&lt;br /&gt;
|-&lt;br /&gt;
|EP0ACK&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP0_IN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP0_OUT&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP1_IN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP1_OUT&lt;br /&gt;
|0x115d&lt;br /&gt;
|-&lt;br /&gt;
|EP2&lt;br /&gt;
|0x11a2&lt;br /&gt;
|-&lt;br /&gt;
|EP4&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|IBN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP0PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP1PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|ERRLIMIT&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2ISOERR&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4ISOERRF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6ISOERR&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8ISOERRF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2FF&lt;br /&gt;
|0x11e7&lt;br /&gt;
|-&lt;br /&gt;
|EP4FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|GPIFDONE&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|GPIFWF&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Endpoint 1 OUT (EP1_OUT) handler ===&lt;br /&gt;
&lt;br /&gt;
After decrypting the OUT packet, processing of the packet proceeds depending on the first byte of the packet, which selects the operation.  After the operation, any resulting IN packet will be encrypted before submitting it to the host.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Byte&lt;br /&gt;
! Handler&lt;br /&gt;
! Operation&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 0x14f&lt;br /&gt;
| Configure endpoints for quad-buffered bulk FIFO operation, and trigger a GPIF read on EP2.&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 0x157&lt;br /&gt;
| Abort the GPIF.&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| 0x15f&lt;br /&gt;
| Write data to EEPROM with I²C address 1010000 (single addressing mode).  The second and third byte contain a fixed magic cookie of 0x42 0x55.  The fourth byte contains the single byte address.  The fifth byte contains the number of bytes to write (1-58).  The rest of the packet contains the data to write.&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| 0x1b3&lt;br /&gt;
| Read data from EEPROM with I²C address 1010000 (single byte addressing mode).  The second and third byte contain a fixed magic cookie of 0x33 0x81.  The fourth byte contains the single byte address.  The fifth byte contains the number of bytes to read (1-64). The data will be available as an IN transfer.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7a&lt;br /&gt;
| 0x309&lt;br /&gt;
| Upload the sine table for LED flashing.  The second byte contains the offset to start writing at, and the third byte the number of bytes to write.  A maximum of 61 bytes can be uploaded per packet, so two packets are needed to write the entire table.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7b&lt;br /&gt;
| 0x346&lt;br /&gt;
| Enable or disable LED flashing.  The second byte of the packet is a bool indicating if LED flashing should be enabled.  The following bytes are only used if LED flashing is enabled, but are always transmitted.  If flashing is enabled, the LED brighness will periodically be set from the sine table.  Byte 3 and 4 of the packet are the Timer 2 reload value, in little endian format.  Byte 5 is a software clock divisor.  The pointer in the sine table will be advanced by one every (0x10000-RELOAD)*(DIV+1)/4000000 seconds.  Byte 6 is a boolean indicating whether to repeat the waveform (1) or stop at the end of the first period (0).&lt;br /&gt;
|-&lt;br /&gt;
| 0x7c&lt;br /&gt;
| 0x282&lt;br /&gt;
| Re-renumerate; return control to the builtin bootloader.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7d&lt;br /&gt;
| 0x2aa&lt;br /&gt;
| Abort the GPIF.  The second byte of the packet is returned complemented in an IN transfer, as acknowledgement.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7e&lt;br /&gt;
| 0x2cf&lt;br /&gt;
| Disable LED flashing, configure the GPIF, and prepare the FPGA for bitstream upload by pulsing PROG_B and then waiting for INIT_B.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7f&lt;br /&gt;
| 0x2e4&lt;br /&gt;
| Disable LED flashing, transmit N (1-62) bytes of bitstream on the FPGA DIN pin, clocked by CCLK.  The second byte of the packet encodes N.&lt;br /&gt;
|-&lt;br /&gt;
| 0x80&lt;br /&gt;
| 0x205&lt;br /&gt;
| Transmit N (1-31) 16-bit words to the FPGA.  The second byte of the packet encodes N. Data is sent on PA6, MSB first, with rising edges of PA5 to clock the bits out. During each word transfer, PA4 is held low.  The most significant bit (b15) of each word must be 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x81&lt;br /&gt;
| 0x23b&lt;br /&gt;
| Perform N (1-31) write-read transactions to the FPGA.  The second byte of the packet encodes N.  Each transaction consists of 8 bits (from the out packet) being transmitted on PA6, like for the 0x80 operation above, and then 8 bits being received on PA7.  N bytes will be available for an IN transfer afterwards.  The most significant bit (b7) of each byte to send must be 0, but is actually transmitted as a 1 (to indicate read operation).  PA7 is polled immediately after the falling edge of PA5.  PA4 is held low during each write-read transaction.&lt;br /&gt;
|-&lt;br /&gt;
| 0x82&lt;br /&gt;
| 0x3a3&lt;br /&gt;
| Read the REVID register.  16 bits of REVID data will be available for an IN transfer.&lt;br /&gt;
|-&lt;br /&gt;
| others&lt;br /&gt;
| 0x3c7&lt;br /&gt;
| Do nothing&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Command 0x7e waveform ====&lt;br /&gt;
[[File:Logic16 FW Command 0x7e Waveform.svg]]&lt;br /&gt;
==== Command 0x7f waveform ====&lt;br /&gt;
[[File:Logic16 FW Command 0x7f Waveform.svg]]&lt;br /&gt;
==== Command 0x80 waveform ====&lt;br /&gt;
[[File:Logic16 FW Command 0x80 Waveform.svg]]&lt;br /&gt;
==== Command 0x81 waveform ====&lt;br /&gt;
[[File:Logic16 FW Command 0x81 Waveform.svg]]&lt;br /&gt;
&lt;br /&gt;
== XDATA variables ==&lt;br /&gt;
The following variables are stored in the 8K &amp;quot;external&amp;quot; code/data memory, after the firmware code.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!rowspan=&amp;quot;2&amp;quot;|Address&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Init data in FW&lt;br /&gt;
!rowspan=&amp;quot;2&amp;quot;|Contents&lt;br /&gt;
|-&lt;br /&gt;
!Address&lt;br /&gt;
!Value&lt;br /&gt;
|-&lt;br /&gt;
|0x1f00-0x1f7f&lt;br /&gt;
|0x8d6-0x955&lt;br /&gt;
|&lt;br /&gt;
|WAVEDATA&lt;br /&gt;
|-&lt;br /&gt;
|0x1f80&lt;br /&gt;
|0x981&lt;br /&gt;
|0xe0&lt;br /&gt;
|GPIFREADYCFG&lt;br /&gt;
|-&lt;br /&gt;
|0x1f81&lt;br /&gt;
|0x982&lt;br /&gt;
|0x10&lt;br /&gt;
|GPIFCTLCFG&lt;br /&gt;
|-&lt;br /&gt;
|0x1f82&lt;br /&gt;
|0x983&lt;br /&gt;
|0x00&lt;br /&gt;
|GPIFIDLECS&lt;br /&gt;
|-&lt;br /&gt;
|0x1f83&lt;br /&gt;
|0x984&lt;br /&gt;
|0x05&lt;br /&gt;
|GPIFIDLECTL&lt;br /&gt;
|-&lt;br /&gt;
|0x1f84&lt;br /&gt;
|0x985&lt;br /&gt;
|0xee&lt;br /&gt;
|?&lt;br /&gt;
|-&lt;br /&gt;
|0x1f85&lt;br /&gt;
|0x986&lt;br /&gt;
|0x50&lt;br /&gt;
|GPIFWFSELECT&lt;br /&gt;
|-&lt;br /&gt;
|0x1f86&lt;br /&gt;
|0x987&lt;br /&gt;
|0x00&lt;br /&gt;
|GPIFREADYSTAT&lt;br /&gt;
|-&lt;br /&gt;
|0x1f87&lt;br /&gt;
|0x95a&lt;br /&gt;
|0x00&lt;br /&gt;
|FLOWSTATE&lt;br /&gt;
|-&lt;br /&gt;
|0x1f88&lt;br /&gt;
|0x95b&lt;br /&gt;
|0x00&lt;br /&gt;
|FLOWLOGIC&lt;br /&gt;
|-&lt;br /&gt;
|0x1f89&lt;br /&gt;
|0x95c&lt;br /&gt;
|0x00&lt;br /&gt;
|FLOWEQ0CTL&lt;br /&gt;
|-&lt;br /&gt;
|0x1f8a&lt;br /&gt;
|0x95d&lt;br /&gt;
|0x00&lt;br /&gt;
|FLOWEQ1CTL&lt;br /&gt;
|-&lt;br /&gt;
|0x1f8b&lt;br /&gt;
|0x95e&lt;br /&gt;
|0x00&lt;br /&gt;
|FLOWHOLDOFF&lt;br /&gt;
|-&lt;br /&gt;
|0x1f8c&lt;br /&gt;
|0x95f&lt;br /&gt;
|0x00&lt;br /&gt;
|FLOWSTB&lt;br /&gt;
|-&lt;br /&gt;
|0x1f8d&lt;br /&gt;
|0x960&lt;br /&gt;
|0x00&lt;br /&gt;
|FLOWSTBEDGE&lt;br /&gt;
|-&lt;br /&gt;
|0x1f8e&lt;br /&gt;
|0x961&lt;br /&gt;
|0x00&lt;br /&gt;
|FLOWSTBHPERIOD&lt;br /&gt;
|-&lt;br /&gt;
|0x1f8f-0x1faa&lt;br /&gt;
|0x962-0x97d&lt;br /&gt;
|0x00&lt;br /&gt;
|?&lt;br /&gt;
|-&lt;br /&gt;
|0x1fab-0x1fea&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|64 byte sine table for LED flashing&lt;br /&gt;
|}&lt;br /&gt;
=== WAVEDATA ===&lt;br /&gt;
The following data is loaded into WAVEDATA on bootup, and whenever operation 0x7e is performed:&lt;br /&gt;
==== Waveform descriptor 0 ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!State&lt;br /&gt;
!Length/Branch&lt;br /&gt;
!Opcode&lt;br /&gt;
!Output&lt;br /&gt;
!Logic&lt;br /&gt;
!Operation&lt;br /&gt;
!NEXT&lt;br /&gt;
!DATA&lt;br /&gt;
!CTL2&lt;br /&gt;
!CTL1&lt;br /&gt;
!CTL0&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|0x81&lt;br /&gt;
|0x01  &lt;br /&gt;
|0x05  &lt;br /&gt;
|0x70&lt;br /&gt;
|if FF or RDY0 then 0 (ReExec) else 1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|0xB8  &lt;br /&gt;
|0x07  &lt;br /&gt;
|0x04  &lt;br /&gt;
|0x2D&lt;br /&gt;
|if TC expired then 7 else 0&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|0x01  &lt;br /&gt;
|0x02  &lt;br /&gt;
|0x04  &lt;br /&gt;
|0x00  &lt;br /&gt;
|Delay 1&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|0x01  &lt;br /&gt;
|0x02  &lt;br /&gt;
|0x04  &lt;br /&gt;
|0x00  &lt;br /&gt;
|Delay 1&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|0x01  &lt;br /&gt;
|0x02  &lt;br /&gt;
|0x04  &lt;br /&gt;
|0x00  &lt;br /&gt;
|Delay 1&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|5&lt;br /&gt;
|0x01  &lt;br /&gt;
|0x02  &lt;br /&gt;
|0x04  &lt;br /&gt;
|0x00  &lt;br /&gt;
|Delay 1&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|6&lt;br /&gt;
|0x01  &lt;br /&gt;
|0x02  &lt;br /&gt;
|0x04  &lt;br /&gt;
|0x00  &lt;br /&gt;
|Delay 1&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Waveform descriptor 1-3 ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!State&lt;br /&gt;
!Length/Branch&lt;br /&gt;
!Opcode&lt;br /&gt;
!Output&lt;br /&gt;
!Logic&lt;br /&gt;
!Operation&lt;br /&gt;
!NEXT&lt;br /&gt;
!DATA&lt;br /&gt;
!CTL2&lt;br /&gt;
!CTL1&lt;br /&gt;
!CTL0&lt;br /&gt;
|-&lt;br /&gt;
|0-6&lt;br /&gt;
|0x01&lt;br /&gt;
|0x00&lt;br /&gt;
|0x05&lt;br /&gt;
|0x00&lt;br /&gt;
|Delay 1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== FPGA variables ==&lt;br /&gt;
The following variables can be read and written by the host using operations 0x81 and 0x80:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Address&lt;br /&gt;
! Contents&lt;br /&gt;
|-&lt;br /&gt;
|0x00&lt;br /&gt;
|? (Read only.  Status?)&lt;br /&gt;
|-&lt;br /&gt;
|0x02&lt;br /&gt;
|Channel select low.  Each 1 bit in this byte enables one of the channels 0-7 for acquisition.&lt;br /&gt;
|-&lt;br /&gt;
|0x03&lt;br /&gt;
|Channel select high.  Each 1 bit in this byte enables one of the channels 8-15 for acquisition.&lt;br /&gt;
|-&lt;br /&gt;
|0x04&lt;br /&gt;
|Sampling rate divisor.  Sample rate is the base clock divided by N+1, where N is the value in this register.&lt;br /&gt;
|-&lt;br /&gt;
|0x05&lt;br /&gt;
|LED brightness.  0 = min (off), 0xff = max, 0x19 = dimmed.&lt;br /&gt;
|-&lt;br /&gt;
|0x06&lt;br /&gt;
|?&lt;br /&gt;
|-&lt;br /&gt;
|0x07&lt;br /&gt;
|?&lt;br /&gt;
|-&lt;br /&gt;
|0x0a&lt;br /&gt;
|Bit 7 = ?.  Bit 6 = ?.  Bit 0 = Sampling base clock select: 0 = 100MHz, 1 = 160MHz&lt;br /&gt;
|-&lt;br /&gt;
|0x0c&lt;br /&gt;
|?&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Marcus Comstedt</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=Saleae_Logic16/Firmware&amp;diff=6903</id>
		<title>Saleae Logic16/Firmware</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=Saleae_Logic16/Firmware&amp;diff=6903"/>
		<updated>2013-07-31T20:46:21Z</updated>

		<summary type="html">&lt;p&gt;Marcus Comstedt: /* FPGA variables */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The following information is related to the vendor firmware included with the&lt;br /&gt;
version 1.1.15 of the vendor application &amp;quot;Logic&amp;quot;.&lt;br /&gt;
== Interrupt handlers ==&lt;br /&gt;
The following interrupt handlers are installed.  If the address is absent, it means the handler just returns (RETI) without performing any action.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|RESET&lt;br /&gt;
|0x0000&lt;br /&gt;
|-&lt;br /&gt;
|TF2&lt;br /&gt;
|0x0e65&lt;br /&gt;
|-&lt;br /&gt;
|RESUME&lt;br /&gt;
|0x002e&lt;br /&gt;
|-&lt;br /&gt;
|SUDAV&lt;br /&gt;
|0x0ae8&lt;br /&gt;
|-&lt;br /&gt;
|SOF&lt;br /&gt;
|0x13d2&lt;br /&gt;
|-&lt;br /&gt;
|SUTOK&lt;br /&gt;
|0x13bf&lt;br /&gt;
|-&lt;br /&gt;
|SUSPEND&lt;br /&gt;
|0x13aa&lt;br /&gt;
|-&lt;br /&gt;
|USB_RESET&lt;br /&gt;
|0x130b&lt;br /&gt;
|-&lt;br /&gt;
|HISPEED&lt;br /&gt;
|0x12df&lt;br /&gt;
|-&lt;br /&gt;
|EP0ACK&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP0_IN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP0_OUT&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP1_IN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP1_OUT&lt;br /&gt;
|0x115d&lt;br /&gt;
|-&lt;br /&gt;
|EP2&lt;br /&gt;
|0x11a2&lt;br /&gt;
|-&lt;br /&gt;
|EP4&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|IBN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP0PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP1PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|ERRLIMIT&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2ISOERR&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4ISOERRF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6ISOERR&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8ISOERRF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2FF&lt;br /&gt;
|0x11e7&lt;br /&gt;
|-&lt;br /&gt;
|EP4FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|GPIFDONE&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|GPIFWF&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Endpoint 1 OUT (EP1_OUT) handler ===&lt;br /&gt;
&lt;br /&gt;
After decrypting the OUT packet, processing of the packet proceeds depending on the first byte of the packet, which selects the operation.  After the operation, any resulting IN packet will be encrypted before submitting it to the host.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Byte&lt;br /&gt;
! Handler&lt;br /&gt;
! Operation&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 0x14f&lt;br /&gt;
| Configure endpoints for quad-buffered bulk FIFO operation, and trigger a GPIF read on EP2.&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 0x157&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| 0x15f&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| 0x1b3&lt;br /&gt;
| Read data from EEPROM with I²C address 1010000 (single byte addressing mode).  The second and third byte contain a fixed magic cookie of 0x33 0x81.  The fourth byte contains the single byte address.  The fifth byte contains the number of bytes to read (1-64). The data will be available as an IN transfer.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7a&lt;br /&gt;
| 0x309&lt;br /&gt;
| Upload the sine table for LED flashing.  The second byte contains the offset to start writing at, and the third byte the number of bytes to write.  A maximum of 61 bytes can be uploaded per packet, so two packets are needed to write the entire table.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7b&lt;br /&gt;
| 0x346&lt;br /&gt;
| Enable or disable LED flashing.  The second byte of the packet is a bool indicating if LED flashing should be enabled.  The following bytes are only used if LED flashing is enabled, but are always transmitted.  If flashing is enabled, the LED brighness will periodically be set from the sine table.  Byte 3 and 4 of the packet are the Timer 2 reload value, in little endian format.  Byte 5 is a software clock divisor.  The pointer in the sine table will be advanced by one every (0x10000-RELOAD)*(DIV+1)/4000000 seconds.  Byte 6 is a boolean indicating whether to repeat the waveform (1) or stop at the end of the first period (0).&lt;br /&gt;
|-&lt;br /&gt;
| 0x7c&lt;br /&gt;
| 0x282&lt;br /&gt;
| Re-renumerate; return control to the builtin bootloader.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7d&lt;br /&gt;
| 0x2aa&lt;br /&gt;
| Abort the GPIF.  The second byte of the packet is returned complemented in an IN transfer, as acknowledgement.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7e&lt;br /&gt;
| 0x2cf&lt;br /&gt;
| Disable LED flashing, configure the GPIF, and prepare the FPGA for bitstream upload by pulsing PROG_B and then waiting for INIT_B.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7f&lt;br /&gt;
| 0x2e4&lt;br /&gt;
| Disable LED flashing, transmit N (1-62) bytes of bitstream on the FPGA DIN pin, clocked by CCLK.  The second byte of the packet encodes N.&lt;br /&gt;
|-&lt;br /&gt;
| 0x80&lt;br /&gt;
| 0x205&lt;br /&gt;
| Transmit N (1-31) 16-bit words to the FPGA.  The second byte of the packet encodes N. Data is sent on PA6, MSB first, with rising edges of PA5 to clock the bits out. During each word transfer, PA4 is held low.  The most significant bit (b15) of each word must be 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x81&lt;br /&gt;
| 0x23b&lt;br /&gt;
| Perform N (1-31) write-read transactions to the FPGA.  The second byte of the packet encodes N.  Each transaction consists of 8 bits (from the out packet) being transmitted on PA6, like for the 0x80 operation above, and then 8 bits being received on PA7.  N bytes will be available for an IN transfer afterwards.  The most significant bit (b7) of each byte to send must be 0, but is actually transmitted as a 1 (to indicate read operation).  PA7 is polled immediately after the falling edge of PA5.  PA4 is held low during each write-read transaction.&lt;br /&gt;
|-&lt;br /&gt;
| 0x82&lt;br /&gt;
| 0x3a3&lt;br /&gt;
| Read the REVID register.  16 bits of REVID data will be available for an IN transfer.&lt;br /&gt;
|-&lt;br /&gt;
| others&lt;br /&gt;
| 0x3c7&lt;br /&gt;
| Do nothing&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Command 0x7e waveform ====&lt;br /&gt;
[[File:Logic16 FW Command 0x7e Waveform.svg]]&lt;br /&gt;
==== Command 0x7f waveform ====&lt;br /&gt;
[[File:Logic16 FW Command 0x7f Waveform.svg]]&lt;br /&gt;
==== Command 0x80 waveform ====&lt;br /&gt;
[[File:Logic16 FW Command 0x80 Waveform.svg]]&lt;br /&gt;
==== Command 0x81 waveform ====&lt;br /&gt;
[[File:Logic16 FW Command 0x81 Waveform.svg]]&lt;br /&gt;
&lt;br /&gt;
== XDATA variables ==&lt;br /&gt;
The following variables are stored in the 8K &amp;quot;external&amp;quot; code/data memory, after the firmware code.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!rowspan=&amp;quot;2&amp;quot;|Address&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Init data in FW&lt;br /&gt;
!rowspan=&amp;quot;2&amp;quot;|Contents&lt;br /&gt;
|-&lt;br /&gt;
!Address&lt;br /&gt;
!Value&lt;br /&gt;
|-&lt;br /&gt;
|0x1f00-0x1f7f&lt;br /&gt;
|0x8d6-0x955&lt;br /&gt;
|&lt;br /&gt;
|WAVEDATA&lt;br /&gt;
|-&lt;br /&gt;
|0x1f80&lt;br /&gt;
|0x981&lt;br /&gt;
|0xe0&lt;br /&gt;
|GPIFREADYCFG&lt;br /&gt;
|-&lt;br /&gt;
|0x1f81&lt;br /&gt;
|0x982&lt;br /&gt;
|0x10&lt;br /&gt;
|GPIFCTLCFG&lt;br /&gt;
|-&lt;br /&gt;
|0x1f82&lt;br /&gt;
|0x983&lt;br /&gt;
|0x00&lt;br /&gt;
|GPIFIDLECS&lt;br /&gt;
|-&lt;br /&gt;
|0x1f83&lt;br /&gt;
|0x984&lt;br /&gt;
|0x05&lt;br /&gt;
|GPIFIDLECTL&lt;br /&gt;
|-&lt;br /&gt;
|0x1f84&lt;br /&gt;
|0x985&lt;br /&gt;
|0xee&lt;br /&gt;
|?&lt;br /&gt;
|-&lt;br /&gt;
|0x1f85&lt;br /&gt;
|0x986&lt;br /&gt;
|0x50&lt;br /&gt;
|GPIFWFSELECT&lt;br /&gt;
|-&lt;br /&gt;
|0x1f86&lt;br /&gt;
|0x987&lt;br /&gt;
|0x00&lt;br /&gt;
|GPIFREADYSTAT&lt;br /&gt;
|-&lt;br /&gt;
|0x1f87&lt;br /&gt;
|0x95a&lt;br /&gt;
|0x00&lt;br /&gt;
|FLOWSTATE&lt;br /&gt;
|-&lt;br /&gt;
|0x1f88&lt;br /&gt;
|0x95b&lt;br /&gt;
|0x00&lt;br /&gt;
|FLOWLOGIC&lt;br /&gt;
|-&lt;br /&gt;
|0x1f89&lt;br /&gt;
|0x95c&lt;br /&gt;
|0x00&lt;br /&gt;
|FLOWEQ0CTL&lt;br /&gt;
|-&lt;br /&gt;
|0x1f8a&lt;br /&gt;
|0x95d&lt;br /&gt;
|0x00&lt;br /&gt;
|FLOWEQ1CTL&lt;br /&gt;
|-&lt;br /&gt;
|0x1f8b&lt;br /&gt;
|0x95e&lt;br /&gt;
|0x00&lt;br /&gt;
|FLOWHOLDOFF&lt;br /&gt;
|-&lt;br /&gt;
|0x1f8c&lt;br /&gt;
|0x95f&lt;br /&gt;
|0x00&lt;br /&gt;
|FLOWSTB&lt;br /&gt;
|-&lt;br /&gt;
|0x1f8d&lt;br /&gt;
|0x960&lt;br /&gt;
|0x00&lt;br /&gt;
|FLOWSTBEDGE&lt;br /&gt;
|-&lt;br /&gt;
|0x1f8e&lt;br /&gt;
|0x961&lt;br /&gt;
|0x00&lt;br /&gt;
|FLOWSTBHPERIOD&lt;br /&gt;
|-&lt;br /&gt;
|0x1f8f-0x1faa&lt;br /&gt;
|0x962-0x97d&lt;br /&gt;
|0x00&lt;br /&gt;
|?&lt;br /&gt;
|-&lt;br /&gt;
|0x1fab-0x1fea&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|64 byte sine table for LED flashing&lt;br /&gt;
|}&lt;br /&gt;
=== WAVEDATA ===&lt;br /&gt;
The following data is loaded into WAVEDATA on bootup, and whenever operation 0x7e is performed:&lt;br /&gt;
==== Waveform descriptor 0 ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!State&lt;br /&gt;
!Length/Branch&lt;br /&gt;
!Opcode&lt;br /&gt;
!Output&lt;br /&gt;
!Logic&lt;br /&gt;
!Operation&lt;br /&gt;
!NEXT&lt;br /&gt;
!DATA&lt;br /&gt;
!CTL2&lt;br /&gt;
!CTL1&lt;br /&gt;
!CTL0&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|0x81&lt;br /&gt;
|0x01  &lt;br /&gt;
|0x05  &lt;br /&gt;
|0x70&lt;br /&gt;
|if FF or RDY0 then 0 (ReExec) else 1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|0xB8  &lt;br /&gt;
|0x07  &lt;br /&gt;
|0x04  &lt;br /&gt;
|0x2D&lt;br /&gt;
|if TC expired then 7 else 0&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|0x01  &lt;br /&gt;
|0x02  &lt;br /&gt;
|0x04  &lt;br /&gt;
|0x00  &lt;br /&gt;
|Delay 1&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|0x01  &lt;br /&gt;
|0x02  &lt;br /&gt;
|0x04  &lt;br /&gt;
|0x00  &lt;br /&gt;
|Delay 1&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|0x01  &lt;br /&gt;
|0x02  &lt;br /&gt;
|0x04  &lt;br /&gt;
|0x00  &lt;br /&gt;
|Delay 1&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|5&lt;br /&gt;
|0x01  &lt;br /&gt;
|0x02  &lt;br /&gt;
|0x04  &lt;br /&gt;
|0x00  &lt;br /&gt;
|Delay 1&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|6&lt;br /&gt;
|0x01  &lt;br /&gt;
|0x02  &lt;br /&gt;
|0x04  &lt;br /&gt;
|0x00  &lt;br /&gt;
|Delay 1&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Waveform descriptor 1-3 ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!State&lt;br /&gt;
!Length/Branch&lt;br /&gt;
!Opcode&lt;br /&gt;
!Output&lt;br /&gt;
!Logic&lt;br /&gt;
!Operation&lt;br /&gt;
!NEXT&lt;br /&gt;
!DATA&lt;br /&gt;
!CTL2&lt;br /&gt;
!CTL1&lt;br /&gt;
!CTL0&lt;br /&gt;
|-&lt;br /&gt;
|0-6&lt;br /&gt;
|0x01&lt;br /&gt;
|0x00&lt;br /&gt;
|0x05&lt;br /&gt;
|0x00&lt;br /&gt;
|Delay 1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== FPGA variables ==&lt;br /&gt;
The following variables can be read and written by the host using operations 0x81 and 0x80:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Address&lt;br /&gt;
! Contents&lt;br /&gt;
|-&lt;br /&gt;
|0x00&lt;br /&gt;
|? (Read only.  Status?)&lt;br /&gt;
|-&lt;br /&gt;
|0x02&lt;br /&gt;
|Channel select low.  Each 1 bit in this byte enables one of the channels 0-7 for acquisition.&lt;br /&gt;
|-&lt;br /&gt;
|0x03&lt;br /&gt;
|Channel select high.  Each 1 bit in this byte enables one of the channels 8-15 for acquisition.&lt;br /&gt;
|-&lt;br /&gt;
|0x04&lt;br /&gt;
|Sampling rate divisor.  Sample rate is the base clock divided by N+1, where N is the value in this register.&lt;br /&gt;
|-&lt;br /&gt;
|0x05&lt;br /&gt;
|LED brightness.  0 = min (off), 0xff = max, 0x19 = dimmed.&lt;br /&gt;
|-&lt;br /&gt;
|0x06&lt;br /&gt;
|?&lt;br /&gt;
|-&lt;br /&gt;
|0x07&lt;br /&gt;
|?&lt;br /&gt;
|-&lt;br /&gt;
|0x0a&lt;br /&gt;
|Bit 7 = ?.  Bit 6 = ?.  Bit 0 = Sampling base clock select: 0 = 100MHz, 1 = 160MHz&lt;br /&gt;
|-&lt;br /&gt;
|0x0c&lt;br /&gt;
|?&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Marcus Comstedt</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=Saleae_Logic16/Firmware&amp;diff=6902</id>
		<title>Saleae Logic16/Firmware</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=Saleae_Logic16/Firmware&amp;diff=6902"/>
		<updated>2013-07-31T20:38:06Z</updated>

		<summary type="html">&lt;p&gt;Marcus Comstedt: /* Endpoint 1 OUT (EP1_OUT) handler */ Explain operation 0x7&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The following information is related to the vendor firmware included with the&lt;br /&gt;
version 1.1.15 of the vendor application &amp;quot;Logic&amp;quot;.&lt;br /&gt;
== Interrupt handlers ==&lt;br /&gt;
The following interrupt handlers are installed.  If the address is absent, it means the handler just returns (RETI) without performing any action.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|RESET&lt;br /&gt;
|0x0000&lt;br /&gt;
|-&lt;br /&gt;
|TF2&lt;br /&gt;
|0x0e65&lt;br /&gt;
|-&lt;br /&gt;
|RESUME&lt;br /&gt;
|0x002e&lt;br /&gt;
|-&lt;br /&gt;
|SUDAV&lt;br /&gt;
|0x0ae8&lt;br /&gt;
|-&lt;br /&gt;
|SOF&lt;br /&gt;
|0x13d2&lt;br /&gt;
|-&lt;br /&gt;
|SUTOK&lt;br /&gt;
|0x13bf&lt;br /&gt;
|-&lt;br /&gt;
|SUSPEND&lt;br /&gt;
|0x13aa&lt;br /&gt;
|-&lt;br /&gt;
|USB_RESET&lt;br /&gt;
|0x130b&lt;br /&gt;
|-&lt;br /&gt;
|HISPEED&lt;br /&gt;
|0x12df&lt;br /&gt;
|-&lt;br /&gt;
|EP0ACK&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP0_IN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP0_OUT&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP1_IN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP1_OUT&lt;br /&gt;
|0x115d&lt;br /&gt;
|-&lt;br /&gt;
|EP2&lt;br /&gt;
|0x11a2&lt;br /&gt;
|-&lt;br /&gt;
|EP4&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|IBN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP0PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP1PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|ERRLIMIT&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2ISOERR&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4ISOERRF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6ISOERR&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8ISOERRF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2FF&lt;br /&gt;
|0x11e7&lt;br /&gt;
|-&lt;br /&gt;
|EP4FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|GPIFDONE&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|GPIFWF&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Endpoint 1 OUT (EP1_OUT) handler ===&lt;br /&gt;
&lt;br /&gt;
After decrypting the OUT packet, processing of the packet proceeds depending on the first byte of the packet, which selects the operation.  After the operation, any resulting IN packet will be encrypted before submitting it to the host.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Byte&lt;br /&gt;
! Handler&lt;br /&gt;
! Operation&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 0x14f&lt;br /&gt;
| Configure endpoints for quad-buffered bulk FIFO operation, and trigger a GPIF read on EP2.&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 0x157&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| 0x15f&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| 0x1b3&lt;br /&gt;
| Read data from EEPROM with I²C address 1010000 (single byte addressing mode).  The second and third byte contain a fixed magic cookie of 0x33 0x81.  The fourth byte contains the single byte address.  The fifth byte contains the number of bytes to read (1-64). The data will be available as an IN transfer.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7a&lt;br /&gt;
| 0x309&lt;br /&gt;
| Upload the sine table for LED flashing.  The second byte contains the offset to start writing at, and the third byte the number of bytes to write.  A maximum of 61 bytes can be uploaded per packet, so two packets are needed to write the entire table.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7b&lt;br /&gt;
| 0x346&lt;br /&gt;
| Enable or disable LED flashing.  The second byte of the packet is a bool indicating if LED flashing should be enabled.  The following bytes are only used if LED flashing is enabled, but are always transmitted.  If flashing is enabled, the LED brighness will periodically be set from the sine table.  Byte 3 and 4 of the packet are the Timer 2 reload value, in little endian format.  Byte 5 is a software clock divisor.  The pointer in the sine table will be advanced by one every (0x10000-RELOAD)*(DIV+1)/4000000 seconds.  Byte 6 is a boolean indicating whether to repeat the waveform (1) or stop at the end of the first period (0).&lt;br /&gt;
|-&lt;br /&gt;
| 0x7c&lt;br /&gt;
| 0x282&lt;br /&gt;
| Re-renumerate; return control to the builtin bootloader.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7d&lt;br /&gt;
| 0x2aa&lt;br /&gt;
| Abort the GPIF.  The second byte of the packet is returned complemented in an IN transfer, as acknowledgement.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7e&lt;br /&gt;
| 0x2cf&lt;br /&gt;
| Disable LED flashing, configure the GPIF, and prepare the FPGA for bitstream upload by pulsing PROG_B and then waiting for INIT_B.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7f&lt;br /&gt;
| 0x2e4&lt;br /&gt;
| Disable LED flashing, transmit N (1-62) bytes of bitstream on the FPGA DIN pin, clocked by CCLK.  The second byte of the packet encodes N.&lt;br /&gt;
|-&lt;br /&gt;
| 0x80&lt;br /&gt;
| 0x205&lt;br /&gt;
| Transmit N (1-31) 16-bit words to the FPGA.  The second byte of the packet encodes N. Data is sent on PA6, MSB first, with rising edges of PA5 to clock the bits out. During each word transfer, PA4 is held low.  The most significant bit (b15) of each word must be 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x81&lt;br /&gt;
| 0x23b&lt;br /&gt;
| Perform N (1-31) write-read transactions to the FPGA.  The second byte of the packet encodes N.  Each transaction consists of 8 bits (from the out packet) being transmitted on PA6, like for the 0x80 operation above, and then 8 bits being received on PA7.  N bytes will be available for an IN transfer afterwards.  The most significant bit (b7) of each byte to send must be 0, but is actually transmitted as a 1 (to indicate read operation).  PA7 is polled immediately after the falling edge of PA5.  PA4 is held low during each write-read transaction.&lt;br /&gt;
|-&lt;br /&gt;
| 0x82&lt;br /&gt;
| 0x3a3&lt;br /&gt;
| Read the REVID register.  16 bits of REVID data will be available for an IN transfer.&lt;br /&gt;
|-&lt;br /&gt;
| others&lt;br /&gt;
| 0x3c7&lt;br /&gt;
| Do nothing&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Command 0x7e waveform ====&lt;br /&gt;
[[File:Logic16 FW Command 0x7e Waveform.svg]]&lt;br /&gt;
==== Command 0x7f waveform ====&lt;br /&gt;
[[File:Logic16 FW Command 0x7f Waveform.svg]]&lt;br /&gt;
==== Command 0x80 waveform ====&lt;br /&gt;
[[File:Logic16 FW Command 0x80 Waveform.svg]]&lt;br /&gt;
==== Command 0x81 waveform ====&lt;br /&gt;
[[File:Logic16 FW Command 0x81 Waveform.svg]]&lt;br /&gt;
&lt;br /&gt;
== XDATA variables ==&lt;br /&gt;
The following variables are stored in the 8K &amp;quot;external&amp;quot; code/data memory, after the firmware code.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!rowspan=&amp;quot;2&amp;quot;|Address&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Init data in FW&lt;br /&gt;
!rowspan=&amp;quot;2&amp;quot;|Contents&lt;br /&gt;
|-&lt;br /&gt;
!Address&lt;br /&gt;
!Value&lt;br /&gt;
|-&lt;br /&gt;
|0x1f00-0x1f7f&lt;br /&gt;
|0x8d6-0x955&lt;br /&gt;
|&lt;br /&gt;
|WAVEDATA&lt;br /&gt;
|-&lt;br /&gt;
|0x1f80&lt;br /&gt;
|0x981&lt;br /&gt;
|0xe0&lt;br /&gt;
|GPIFREADYCFG&lt;br /&gt;
|-&lt;br /&gt;
|0x1f81&lt;br /&gt;
|0x982&lt;br /&gt;
|0x10&lt;br /&gt;
|GPIFCTLCFG&lt;br /&gt;
|-&lt;br /&gt;
|0x1f82&lt;br /&gt;
|0x983&lt;br /&gt;
|0x00&lt;br /&gt;
|GPIFIDLECS&lt;br /&gt;
|-&lt;br /&gt;
|0x1f83&lt;br /&gt;
|0x984&lt;br /&gt;
|0x05&lt;br /&gt;
|GPIFIDLECTL&lt;br /&gt;
|-&lt;br /&gt;
|0x1f84&lt;br /&gt;
|0x985&lt;br /&gt;
|0xee&lt;br /&gt;
|?&lt;br /&gt;
|-&lt;br /&gt;
|0x1f85&lt;br /&gt;
|0x986&lt;br /&gt;
|0x50&lt;br /&gt;
|GPIFWFSELECT&lt;br /&gt;
|-&lt;br /&gt;
|0x1f86&lt;br /&gt;
|0x987&lt;br /&gt;
|0x00&lt;br /&gt;
|GPIFREADYSTAT&lt;br /&gt;
|-&lt;br /&gt;
|0x1f87&lt;br /&gt;
|0x95a&lt;br /&gt;
|0x00&lt;br /&gt;
|FLOWSTATE&lt;br /&gt;
|-&lt;br /&gt;
|0x1f88&lt;br /&gt;
|0x95b&lt;br /&gt;
|0x00&lt;br /&gt;
|FLOWLOGIC&lt;br /&gt;
|-&lt;br /&gt;
|0x1f89&lt;br /&gt;
|0x95c&lt;br /&gt;
|0x00&lt;br /&gt;
|FLOWEQ0CTL&lt;br /&gt;
|-&lt;br /&gt;
|0x1f8a&lt;br /&gt;
|0x95d&lt;br /&gt;
|0x00&lt;br /&gt;
|FLOWEQ1CTL&lt;br /&gt;
|-&lt;br /&gt;
|0x1f8b&lt;br /&gt;
|0x95e&lt;br /&gt;
|0x00&lt;br /&gt;
|FLOWHOLDOFF&lt;br /&gt;
|-&lt;br /&gt;
|0x1f8c&lt;br /&gt;
|0x95f&lt;br /&gt;
|0x00&lt;br /&gt;
|FLOWSTB&lt;br /&gt;
|-&lt;br /&gt;
|0x1f8d&lt;br /&gt;
|0x960&lt;br /&gt;
|0x00&lt;br /&gt;
|FLOWSTBEDGE&lt;br /&gt;
|-&lt;br /&gt;
|0x1f8e&lt;br /&gt;
|0x961&lt;br /&gt;
|0x00&lt;br /&gt;
|FLOWSTBHPERIOD&lt;br /&gt;
|-&lt;br /&gt;
|0x1f8f-0x1faa&lt;br /&gt;
|0x962-0x97d&lt;br /&gt;
|0x00&lt;br /&gt;
|?&lt;br /&gt;
|-&lt;br /&gt;
|0x1fab-0x1fea&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|64 byte sine table for LED flashing&lt;br /&gt;
|}&lt;br /&gt;
=== WAVEDATA ===&lt;br /&gt;
The following data is loaded into WAVEDATA on bootup, and whenever operation 0x7e is performed:&lt;br /&gt;
==== Waveform descriptor 0 ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!State&lt;br /&gt;
!Length/Branch&lt;br /&gt;
!Opcode&lt;br /&gt;
!Output&lt;br /&gt;
!Logic&lt;br /&gt;
!Operation&lt;br /&gt;
!NEXT&lt;br /&gt;
!DATA&lt;br /&gt;
!CTL2&lt;br /&gt;
!CTL1&lt;br /&gt;
!CTL0&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|0x81&lt;br /&gt;
|0x01  &lt;br /&gt;
|0x05  &lt;br /&gt;
|0x70&lt;br /&gt;
|if FF or RDY0 then 0 (ReExec) else 1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|0xB8  &lt;br /&gt;
|0x07  &lt;br /&gt;
|0x04  &lt;br /&gt;
|0x2D&lt;br /&gt;
|if TC expired then 7 else 0&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|0x01  &lt;br /&gt;
|0x02  &lt;br /&gt;
|0x04  &lt;br /&gt;
|0x00  &lt;br /&gt;
|Delay 1&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|0x01  &lt;br /&gt;
|0x02  &lt;br /&gt;
|0x04  &lt;br /&gt;
|0x00  &lt;br /&gt;
|Delay 1&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|0x01  &lt;br /&gt;
|0x02  &lt;br /&gt;
|0x04  &lt;br /&gt;
|0x00  &lt;br /&gt;
|Delay 1&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|5&lt;br /&gt;
|0x01  &lt;br /&gt;
|0x02  &lt;br /&gt;
|0x04  &lt;br /&gt;
|0x00  &lt;br /&gt;
|Delay 1&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|6&lt;br /&gt;
|0x01  &lt;br /&gt;
|0x02  &lt;br /&gt;
|0x04  &lt;br /&gt;
|0x00  &lt;br /&gt;
|Delay 1&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Waveform descriptor 1-3 ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!State&lt;br /&gt;
!Length/Branch&lt;br /&gt;
!Opcode&lt;br /&gt;
!Output&lt;br /&gt;
!Logic&lt;br /&gt;
!Operation&lt;br /&gt;
!NEXT&lt;br /&gt;
!DATA&lt;br /&gt;
!CTL2&lt;br /&gt;
!CTL1&lt;br /&gt;
!CTL0&lt;br /&gt;
|-&lt;br /&gt;
|0-6&lt;br /&gt;
|0x01&lt;br /&gt;
|0x00&lt;br /&gt;
|0x05&lt;br /&gt;
|0x00&lt;br /&gt;
|Delay 1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== FPGA variables ==&lt;br /&gt;
The following variables can be read and written by the host using operations 0x81 and 0x80:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Address&lt;br /&gt;
! Contents&lt;br /&gt;
|-&lt;br /&gt;
|0x02&lt;br /&gt;
|Channel select low.  Each 1 bit in this byte enables one of the channels 0-7 for acquisition.&lt;br /&gt;
|-&lt;br /&gt;
|0x03&lt;br /&gt;
|Channel select high.  Each 1 bit in this byte enables one of the channels 8-15 for acquisition.&lt;br /&gt;
|-&lt;br /&gt;
|0x04&lt;br /&gt;
|Sampling rate divisor.  Sample rate is the base clock divided by N+1, where N is the value in this register.&lt;br /&gt;
|-&lt;br /&gt;
|0x05&lt;br /&gt;
|LED brightness.  0 = min (off), 0xff = max, 0x19 = dimmed.&lt;br /&gt;
|-&lt;br /&gt;
|0x0a&lt;br /&gt;
|Sampling base clock select: 0 = 100MHz, 1 = 160MHz&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Marcus Comstedt</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=Saleae_Logic16/Firmware&amp;diff=6901</id>
		<title>Saleae Logic16/Firmware</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=Saleae_Logic16/Firmware&amp;diff=6901"/>
		<updated>2013-07-31T20:03:38Z</updated>

		<summary type="html">&lt;p&gt;Marcus Comstedt: /* XDATA variables */ Identify XDATA variables controlling FLOW registers&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The following information is related to the vendor firmware included with the&lt;br /&gt;
version 1.1.15 of the vendor application &amp;quot;Logic&amp;quot;.&lt;br /&gt;
== Interrupt handlers ==&lt;br /&gt;
The following interrupt handlers are installed.  If the address is absent, it means the handler just returns (RETI) without performing any action.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|RESET&lt;br /&gt;
|0x0000&lt;br /&gt;
|-&lt;br /&gt;
|TF2&lt;br /&gt;
|0x0e65&lt;br /&gt;
|-&lt;br /&gt;
|RESUME&lt;br /&gt;
|0x002e&lt;br /&gt;
|-&lt;br /&gt;
|SUDAV&lt;br /&gt;
|0x0ae8&lt;br /&gt;
|-&lt;br /&gt;
|SOF&lt;br /&gt;
|0x13d2&lt;br /&gt;
|-&lt;br /&gt;
|SUTOK&lt;br /&gt;
|0x13bf&lt;br /&gt;
|-&lt;br /&gt;
|SUSPEND&lt;br /&gt;
|0x13aa&lt;br /&gt;
|-&lt;br /&gt;
|USB_RESET&lt;br /&gt;
|0x130b&lt;br /&gt;
|-&lt;br /&gt;
|HISPEED&lt;br /&gt;
|0x12df&lt;br /&gt;
|-&lt;br /&gt;
|EP0ACK&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP0_IN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP0_OUT&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP1_IN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP1_OUT&lt;br /&gt;
|0x115d&lt;br /&gt;
|-&lt;br /&gt;
|EP2&lt;br /&gt;
|0x11a2&lt;br /&gt;
|-&lt;br /&gt;
|EP4&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|IBN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP0PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP1PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|ERRLIMIT&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2ISOERR&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4ISOERRF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6ISOERR&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8ISOERRF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2FF&lt;br /&gt;
|0x11e7&lt;br /&gt;
|-&lt;br /&gt;
|EP4FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|GPIFDONE&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|GPIFWF&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Endpoint 1 OUT (EP1_OUT) handler ===&lt;br /&gt;
&lt;br /&gt;
After decrypting the OUT packet, processing of the packet proceeds depending on the first byte of the packet, which selects the operation.  After the operation, any resulting IN packet will be encrypted before submitting it to the host.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Byte&lt;br /&gt;
! Handler&lt;br /&gt;
! Operation&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 0x14f&lt;br /&gt;
| Configure endpoints for quad-buffered bulk FIFO operation, and trigger a GPIF read on EP2.&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 0x157&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| 0x15f&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| 0x1b3&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7a&lt;br /&gt;
| 0x309&lt;br /&gt;
| Upload the sine table for LED flashing.  The second byte contains the offset to start writing at, and the third byte the number of bytes to write.  A maximum of 61 bytes can be uploaded per packet, so two packets are needed to write the entire table.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7b&lt;br /&gt;
| 0x346&lt;br /&gt;
| Enable or disable LED flashing.  The second byte of the packet is a bool indicating if LED flashing should be enabled.  The following bytes are only used if LED flashing is enabled, but are always transmitted.  If flashing is enabled, the LED brighness will periodically be set from the sine table.  Byte 3 and 4 of the packet are the Timer 2 reload value, in little endian format.  Byte 5 is a software clock divisor.  The pointer in the sine table will be advanced by one every (0x10000-RELOAD)*(DIV+1)/4000000 seconds.  Byte 6 is a boolean indicating whether to repeat the waveform (1) or stop at the end of the first period (0).&lt;br /&gt;
|-&lt;br /&gt;
| 0x7c&lt;br /&gt;
| 0x282&lt;br /&gt;
| Re-renumerate; return control to the builtin bootloader.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7d&lt;br /&gt;
| 0x2aa&lt;br /&gt;
| Abort the GPIF.  The second byte of the packet is returned complemented in an IN transfer, as acknowledgement.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7e&lt;br /&gt;
| 0x2cf&lt;br /&gt;
| Disable LED flashing, configure the GPIF, and prepare the FPGA for bitstream upload by pulsing PROG_B and then waiting for INIT_B.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7f&lt;br /&gt;
| 0x2e4&lt;br /&gt;
| Disable LED flashing, transmit N (1-62) bytes of bitstream on the FPGA DIN pin, clocked by CCLK.  The second byte of the packet encodes N.&lt;br /&gt;
|-&lt;br /&gt;
| 0x80&lt;br /&gt;
| 0x205&lt;br /&gt;
| Transmit N (1-31) 16-bit words to the FPGA.  The second byte of the packet encodes N. Data is sent on PA6, MSB first, with rising edges of PA5 to clock the bits out. During each word transfer, PA4 is held low.  The most significant bit (b15) of each word must be 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x81&lt;br /&gt;
| 0x23b&lt;br /&gt;
| Perform N (1-31) write-read transactions to the FPGA.  The second byte of the packet encodes N.  Each transaction consists of 8 bits (from the out packet) being transmitted on PA6, like for the 0x80 operation above, and then 8 bits being received on PA7.  N bytes will be available for an IN transfer afterwards.  The most significant bit (b7) of each byte to send must be 0, but is actually transmitted as a 1 (to indicate read operation).  PA7 is polled immediately after the falling edge of PA5.  PA4 is held low during each write-read transaction.&lt;br /&gt;
|-&lt;br /&gt;
| 0x82&lt;br /&gt;
| 0x3a3&lt;br /&gt;
| Read the REVID register.  16 bits of REVID data will be available for an IN transfer.&lt;br /&gt;
|-&lt;br /&gt;
| others&lt;br /&gt;
| 0x3c7&lt;br /&gt;
| Do nothing&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Command 0x7e waveform ====&lt;br /&gt;
[[File:Logic16 FW Command 0x7e Waveform.svg]]&lt;br /&gt;
==== Command 0x7f waveform ====&lt;br /&gt;
[[File:Logic16 FW Command 0x7f Waveform.svg]]&lt;br /&gt;
==== Command 0x80 waveform ====&lt;br /&gt;
[[File:Logic16 FW Command 0x80 Waveform.svg]]&lt;br /&gt;
==== Command 0x81 waveform ====&lt;br /&gt;
[[File:Logic16 FW Command 0x81 Waveform.svg]]&lt;br /&gt;
&lt;br /&gt;
== XDATA variables ==&lt;br /&gt;
The following variables are stored in the 8K &amp;quot;external&amp;quot; code/data memory, after the firmware code.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!rowspan=&amp;quot;2&amp;quot;|Address&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Init data in FW&lt;br /&gt;
!rowspan=&amp;quot;2&amp;quot;|Contents&lt;br /&gt;
|-&lt;br /&gt;
!Address&lt;br /&gt;
!Value&lt;br /&gt;
|-&lt;br /&gt;
|0x1f00-0x1f7f&lt;br /&gt;
|0x8d6-0x955&lt;br /&gt;
|&lt;br /&gt;
|WAVEDATA&lt;br /&gt;
|-&lt;br /&gt;
|0x1f80&lt;br /&gt;
|0x981&lt;br /&gt;
|0xe0&lt;br /&gt;
|GPIFREADYCFG&lt;br /&gt;
|-&lt;br /&gt;
|0x1f81&lt;br /&gt;
|0x982&lt;br /&gt;
|0x10&lt;br /&gt;
|GPIFCTLCFG&lt;br /&gt;
|-&lt;br /&gt;
|0x1f82&lt;br /&gt;
|0x983&lt;br /&gt;
|0x00&lt;br /&gt;
|GPIFIDLECS&lt;br /&gt;
|-&lt;br /&gt;
|0x1f83&lt;br /&gt;
|0x984&lt;br /&gt;
|0x05&lt;br /&gt;
|GPIFIDLECTL&lt;br /&gt;
|-&lt;br /&gt;
|0x1f84&lt;br /&gt;
|0x985&lt;br /&gt;
|0xee&lt;br /&gt;
|?&lt;br /&gt;
|-&lt;br /&gt;
|0x1f85&lt;br /&gt;
|0x986&lt;br /&gt;
|0x50&lt;br /&gt;
|GPIFWFSELECT&lt;br /&gt;
|-&lt;br /&gt;
|0x1f86&lt;br /&gt;
|0x987&lt;br /&gt;
|0x00&lt;br /&gt;
|GPIFREADYSTAT&lt;br /&gt;
|-&lt;br /&gt;
|0x1f87&lt;br /&gt;
|0x95a&lt;br /&gt;
|0x00&lt;br /&gt;
|FLOWSTATE&lt;br /&gt;
|-&lt;br /&gt;
|0x1f88&lt;br /&gt;
|0x95b&lt;br /&gt;
|0x00&lt;br /&gt;
|FLOWLOGIC&lt;br /&gt;
|-&lt;br /&gt;
|0x1f89&lt;br /&gt;
|0x95c&lt;br /&gt;
|0x00&lt;br /&gt;
|FLOWEQ0CTL&lt;br /&gt;
|-&lt;br /&gt;
|0x1f8a&lt;br /&gt;
|0x95d&lt;br /&gt;
|0x00&lt;br /&gt;
|FLOWEQ1CTL&lt;br /&gt;
|-&lt;br /&gt;
|0x1f8b&lt;br /&gt;
|0x95e&lt;br /&gt;
|0x00&lt;br /&gt;
|FLOWHOLDOFF&lt;br /&gt;
|-&lt;br /&gt;
|0x1f8c&lt;br /&gt;
|0x95f&lt;br /&gt;
|0x00&lt;br /&gt;
|FLOWSTB&lt;br /&gt;
|-&lt;br /&gt;
|0x1f8d&lt;br /&gt;
|0x960&lt;br /&gt;
|0x00&lt;br /&gt;
|FLOWSTBEDGE&lt;br /&gt;
|-&lt;br /&gt;
|0x1f8e&lt;br /&gt;
|0x961&lt;br /&gt;
|0x00&lt;br /&gt;
|FLOWSTBHPERIOD&lt;br /&gt;
|-&lt;br /&gt;
|0x1f8f-0x1faa&lt;br /&gt;
|0x962-0x97d&lt;br /&gt;
|0x00&lt;br /&gt;
|?&lt;br /&gt;
|-&lt;br /&gt;
|0x1fab-0x1fea&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|64 byte sine table for LED flashing&lt;br /&gt;
|}&lt;br /&gt;
=== WAVEDATA ===&lt;br /&gt;
The following data is loaded into WAVEDATA on bootup, and whenever operation 0x7e is performed:&lt;br /&gt;
==== Waveform descriptor 0 ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!State&lt;br /&gt;
!Length/Branch&lt;br /&gt;
!Opcode&lt;br /&gt;
!Output&lt;br /&gt;
!Logic&lt;br /&gt;
!Operation&lt;br /&gt;
!NEXT&lt;br /&gt;
!DATA&lt;br /&gt;
!CTL2&lt;br /&gt;
!CTL1&lt;br /&gt;
!CTL0&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|0x81&lt;br /&gt;
|0x01  &lt;br /&gt;
|0x05  &lt;br /&gt;
|0x70&lt;br /&gt;
|if FF or RDY0 then 0 (ReExec) else 1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|0xB8  &lt;br /&gt;
|0x07  &lt;br /&gt;
|0x04  &lt;br /&gt;
|0x2D&lt;br /&gt;
|if TC expired then 7 else 0&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|0x01  &lt;br /&gt;
|0x02  &lt;br /&gt;
|0x04  &lt;br /&gt;
|0x00  &lt;br /&gt;
|Delay 1&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|0x01  &lt;br /&gt;
|0x02  &lt;br /&gt;
|0x04  &lt;br /&gt;
|0x00  &lt;br /&gt;
|Delay 1&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|0x01  &lt;br /&gt;
|0x02  &lt;br /&gt;
|0x04  &lt;br /&gt;
|0x00  &lt;br /&gt;
|Delay 1&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|5&lt;br /&gt;
|0x01  &lt;br /&gt;
|0x02  &lt;br /&gt;
|0x04  &lt;br /&gt;
|0x00  &lt;br /&gt;
|Delay 1&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|6&lt;br /&gt;
|0x01  &lt;br /&gt;
|0x02  &lt;br /&gt;
|0x04  &lt;br /&gt;
|0x00  &lt;br /&gt;
|Delay 1&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Waveform descriptor 1-3 ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!State&lt;br /&gt;
!Length/Branch&lt;br /&gt;
!Opcode&lt;br /&gt;
!Output&lt;br /&gt;
!Logic&lt;br /&gt;
!Operation&lt;br /&gt;
!NEXT&lt;br /&gt;
!DATA&lt;br /&gt;
!CTL2&lt;br /&gt;
!CTL1&lt;br /&gt;
!CTL0&lt;br /&gt;
|-&lt;br /&gt;
|0-6&lt;br /&gt;
|0x01&lt;br /&gt;
|0x00&lt;br /&gt;
|0x05&lt;br /&gt;
|0x00&lt;br /&gt;
|Delay 1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== FPGA variables ==&lt;br /&gt;
The following variables can be read and written by the host using operations 0x81 and 0x80:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Address&lt;br /&gt;
! Contents&lt;br /&gt;
|-&lt;br /&gt;
|0x02&lt;br /&gt;
|Channel select low.  Each 1 bit in this byte enables one of the channels 0-7 for acquisition.&lt;br /&gt;
|-&lt;br /&gt;
|0x03&lt;br /&gt;
|Channel select high.  Each 1 bit in this byte enables one of the channels 8-15 for acquisition.&lt;br /&gt;
|-&lt;br /&gt;
|0x04&lt;br /&gt;
|Sampling rate divisor.  Sample rate is the base clock divided by N+1, where N is the value in this register.&lt;br /&gt;
|-&lt;br /&gt;
|0x05&lt;br /&gt;
|LED brightness.  0 = min (off), 0xff = max, 0x19 = dimmed.&lt;br /&gt;
|-&lt;br /&gt;
|0x0a&lt;br /&gt;
|Sampling base clock select: 0 = 100MHz, 1 = 160MHz&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Marcus Comstedt</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=Saleae_Logic16/Firmware&amp;diff=6900</id>
		<title>Saleae Logic16/Firmware</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=Saleae_Logic16/Firmware&amp;diff=6900"/>
		<updated>2013-07-31T19:56:15Z</updated>

		<summary type="html">&lt;p&gt;Marcus Comstedt: /* XDATA variables */ Table at 0x1f87 is cleared to all zeroes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The following information is related to the vendor firmware included with the&lt;br /&gt;
version 1.1.15 of the vendor application &amp;quot;Logic&amp;quot;.&lt;br /&gt;
== Interrupt handlers ==&lt;br /&gt;
The following interrupt handlers are installed.  If the address is absent, it means the handler just returns (RETI) without performing any action.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|RESET&lt;br /&gt;
|0x0000&lt;br /&gt;
|-&lt;br /&gt;
|TF2&lt;br /&gt;
|0x0e65&lt;br /&gt;
|-&lt;br /&gt;
|RESUME&lt;br /&gt;
|0x002e&lt;br /&gt;
|-&lt;br /&gt;
|SUDAV&lt;br /&gt;
|0x0ae8&lt;br /&gt;
|-&lt;br /&gt;
|SOF&lt;br /&gt;
|0x13d2&lt;br /&gt;
|-&lt;br /&gt;
|SUTOK&lt;br /&gt;
|0x13bf&lt;br /&gt;
|-&lt;br /&gt;
|SUSPEND&lt;br /&gt;
|0x13aa&lt;br /&gt;
|-&lt;br /&gt;
|USB_RESET&lt;br /&gt;
|0x130b&lt;br /&gt;
|-&lt;br /&gt;
|HISPEED&lt;br /&gt;
|0x12df&lt;br /&gt;
|-&lt;br /&gt;
|EP0ACK&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP0_IN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP0_OUT&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP1_IN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP1_OUT&lt;br /&gt;
|0x115d&lt;br /&gt;
|-&lt;br /&gt;
|EP2&lt;br /&gt;
|0x11a2&lt;br /&gt;
|-&lt;br /&gt;
|EP4&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|IBN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP0PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP1PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|ERRLIMIT&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2ISOERR&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4ISOERRF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6ISOERR&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8ISOERRF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2FF&lt;br /&gt;
|0x11e7&lt;br /&gt;
|-&lt;br /&gt;
|EP4FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|GPIFDONE&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|GPIFWF&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Endpoint 1 OUT (EP1_OUT) handler ===&lt;br /&gt;
&lt;br /&gt;
After decrypting the OUT packet, processing of the packet proceeds depending on the first byte of the packet, which selects the operation.  After the operation, any resulting IN packet will be encrypted before submitting it to the host.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Byte&lt;br /&gt;
! Handler&lt;br /&gt;
! Operation&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 0x14f&lt;br /&gt;
| Configure endpoints for quad-buffered bulk FIFO operation, and trigger a GPIF read on EP2.&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 0x157&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| 0x15f&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| 0x1b3&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7a&lt;br /&gt;
| 0x309&lt;br /&gt;
| Upload the sine table for LED flashing.  The second byte contains the offset to start writing at, and the third byte the number of bytes to write.  A maximum of 61 bytes can be uploaded per packet, so two packets are needed to write the entire table.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7b&lt;br /&gt;
| 0x346&lt;br /&gt;
| Enable or disable LED flashing.  The second byte of the packet is a bool indicating if LED flashing should be enabled.  The following bytes are only used if LED flashing is enabled, but are always transmitted.  If flashing is enabled, the LED brighness will periodically be set from the sine table.  Byte 3 and 4 of the packet are the Timer 2 reload value, in little endian format.  Byte 5 is a software clock divisor.  The pointer in the sine table will be advanced by one every (0x10000-RELOAD)*(DIV+1)/4000000 seconds.  Byte 6 is a boolean indicating whether to repeat the waveform (1) or stop at the end of the first period (0).&lt;br /&gt;
|-&lt;br /&gt;
| 0x7c&lt;br /&gt;
| 0x282&lt;br /&gt;
| Re-renumerate; return control to the builtin bootloader.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7d&lt;br /&gt;
| 0x2aa&lt;br /&gt;
| Abort the GPIF.  The second byte of the packet is returned complemented in an IN transfer, as acknowledgement.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7e&lt;br /&gt;
| 0x2cf&lt;br /&gt;
| Disable LED flashing, configure the GPIF, and prepare the FPGA for bitstream upload by pulsing PROG_B and then waiting for INIT_B.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7f&lt;br /&gt;
| 0x2e4&lt;br /&gt;
| Disable LED flashing, transmit N (1-62) bytes of bitstream on the FPGA DIN pin, clocked by CCLK.  The second byte of the packet encodes N.&lt;br /&gt;
|-&lt;br /&gt;
| 0x80&lt;br /&gt;
| 0x205&lt;br /&gt;
| Transmit N (1-31) 16-bit words to the FPGA.  The second byte of the packet encodes N. Data is sent on PA6, MSB first, with rising edges of PA5 to clock the bits out. During each word transfer, PA4 is held low.  The most significant bit (b15) of each word must be 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x81&lt;br /&gt;
| 0x23b&lt;br /&gt;
| Perform N (1-31) write-read transactions to the FPGA.  The second byte of the packet encodes N.  Each transaction consists of 8 bits (from the out packet) being transmitted on PA6, like for the 0x80 operation above, and then 8 bits being received on PA7.  N bytes will be available for an IN transfer afterwards.  The most significant bit (b7) of each byte to send must be 0, but is actually transmitted as a 1 (to indicate read operation).  PA7 is polled immediately after the falling edge of PA5.  PA4 is held low during each write-read transaction.&lt;br /&gt;
|-&lt;br /&gt;
| 0x82&lt;br /&gt;
| 0x3a3&lt;br /&gt;
| Read the REVID register.  16 bits of REVID data will be available for an IN transfer.&lt;br /&gt;
|-&lt;br /&gt;
| others&lt;br /&gt;
| 0x3c7&lt;br /&gt;
| Do nothing&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Command 0x7e waveform ====&lt;br /&gt;
[[File:Logic16 FW Command 0x7e Waveform.svg]]&lt;br /&gt;
==== Command 0x7f waveform ====&lt;br /&gt;
[[File:Logic16 FW Command 0x7f Waveform.svg]]&lt;br /&gt;
==== Command 0x80 waveform ====&lt;br /&gt;
[[File:Logic16 FW Command 0x80 Waveform.svg]]&lt;br /&gt;
==== Command 0x81 waveform ====&lt;br /&gt;
[[File:Logic16 FW Command 0x81 Waveform.svg]]&lt;br /&gt;
&lt;br /&gt;
== XDATA variables ==&lt;br /&gt;
The following variables are stored in the 8K &amp;quot;external&amp;quot; code/data memory, after the firmware code.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!rowspan=&amp;quot;2&amp;quot;|Address&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Init data in FW&lt;br /&gt;
!rowspan=&amp;quot;2&amp;quot;|Contents&lt;br /&gt;
|-&lt;br /&gt;
!Address&lt;br /&gt;
!Value&lt;br /&gt;
|-&lt;br /&gt;
|0x1f00-0x1f7f&lt;br /&gt;
|0x8d6-0x955&lt;br /&gt;
|&lt;br /&gt;
|WAVEDATA&lt;br /&gt;
|-&lt;br /&gt;
|0x1f80&lt;br /&gt;
|0x981&lt;br /&gt;
|0xe0&lt;br /&gt;
|GPIFREADYCFG&lt;br /&gt;
|-&lt;br /&gt;
|0x1f81&lt;br /&gt;
|0x982&lt;br /&gt;
|0x10&lt;br /&gt;
|GPIFCTLCFG&lt;br /&gt;
|-&lt;br /&gt;
|0x1f82&lt;br /&gt;
|0x983&lt;br /&gt;
|0x00&lt;br /&gt;
|GPIFIDLECS&lt;br /&gt;
|-&lt;br /&gt;
|0x1f83&lt;br /&gt;
|0x984&lt;br /&gt;
|0x05&lt;br /&gt;
|GPIFIDLECTL&lt;br /&gt;
|-&lt;br /&gt;
|0x1f84&lt;br /&gt;
|0x985&lt;br /&gt;
|0xee&lt;br /&gt;
|?&lt;br /&gt;
|-&lt;br /&gt;
|0x1f85&lt;br /&gt;
|0x986&lt;br /&gt;
|0x50&lt;br /&gt;
|GPIFWFSELECT&lt;br /&gt;
|-&lt;br /&gt;
|0x1f86&lt;br /&gt;
|0x987&lt;br /&gt;
|0x00&lt;br /&gt;
|GPIFREADYSTAT&lt;br /&gt;
|-&lt;br /&gt;
|0x1f87-0x1faa&lt;br /&gt;
|0x95a-0x97d&lt;br /&gt;
|0x00&lt;br /&gt;
|?&lt;br /&gt;
|-&lt;br /&gt;
|0x1fab-0x1fea&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|64 byte sine table for LED flashing&lt;br /&gt;
|}&lt;br /&gt;
=== WAVEDATA ===&lt;br /&gt;
The following data is loaded into WAVEDATA on bootup, and whenever operation 0x7e is performed:&lt;br /&gt;
==== Waveform descriptor 0 ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!State&lt;br /&gt;
!Length/Branch&lt;br /&gt;
!Opcode&lt;br /&gt;
!Output&lt;br /&gt;
!Logic&lt;br /&gt;
!Operation&lt;br /&gt;
!NEXT&lt;br /&gt;
!DATA&lt;br /&gt;
!CTL2&lt;br /&gt;
!CTL1&lt;br /&gt;
!CTL0&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|0x81&lt;br /&gt;
|0x01  &lt;br /&gt;
|0x05  &lt;br /&gt;
|0x70&lt;br /&gt;
|if FF or RDY0 then 0 (ReExec) else 1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|0xB8  &lt;br /&gt;
|0x07  &lt;br /&gt;
|0x04  &lt;br /&gt;
|0x2D&lt;br /&gt;
|if TC expired then 7 else 0&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|0x01  &lt;br /&gt;
|0x02  &lt;br /&gt;
|0x04  &lt;br /&gt;
|0x00  &lt;br /&gt;
|Delay 1&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|0x01  &lt;br /&gt;
|0x02  &lt;br /&gt;
|0x04  &lt;br /&gt;
|0x00  &lt;br /&gt;
|Delay 1&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|0x01  &lt;br /&gt;
|0x02  &lt;br /&gt;
|0x04  &lt;br /&gt;
|0x00  &lt;br /&gt;
|Delay 1&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|5&lt;br /&gt;
|0x01  &lt;br /&gt;
|0x02  &lt;br /&gt;
|0x04  &lt;br /&gt;
|0x00  &lt;br /&gt;
|Delay 1&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|6&lt;br /&gt;
|0x01  &lt;br /&gt;
|0x02  &lt;br /&gt;
|0x04  &lt;br /&gt;
|0x00  &lt;br /&gt;
|Delay 1&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Waveform descriptor 1-3 ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!State&lt;br /&gt;
!Length/Branch&lt;br /&gt;
!Opcode&lt;br /&gt;
!Output&lt;br /&gt;
!Logic&lt;br /&gt;
!Operation&lt;br /&gt;
!NEXT&lt;br /&gt;
!DATA&lt;br /&gt;
!CTL2&lt;br /&gt;
!CTL1&lt;br /&gt;
!CTL0&lt;br /&gt;
|-&lt;br /&gt;
|0-6&lt;br /&gt;
|0x01&lt;br /&gt;
|0x00&lt;br /&gt;
|0x05&lt;br /&gt;
|0x00&lt;br /&gt;
|Delay 1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== FPGA variables ==&lt;br /&gt;
The following variables can be read and written by the host using operations 0x81 and 0x80:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Address&lt;br /&gt;
! Contents&lt;br /&gt;
|-&lt;br /&gt;
|0x02&lt;br /&gt;
|Channel select low.  Each 1 bit in this byte enables one of the channels 0-7 for acquisition.&lt;br /&gt;
|-&lt;br /&gt;
|0x03&lt;br /&gt;
|Channel select high.  Each 1 bit in this byte enables one of the channels 8-15 for acquisition.&lt;br /&gt;
|-&lt;br /&gt;
|0x04&lt;br /&gt;
|Sampling rate divisor.  Sample rate is the base clock divided by N+1, where N is the value in this register.&lt;br /&gt;
|-&lt;br /&gt;
|0x05&lt;br /&gt;
|LED brightness.  0 = min (off), 0xff = max, 0x19 = dimmed.&lt;br /&gt;
|-&lt;br /&gt;
|0x0a&lt;br /&gt;
|Sampling base clock select: 0 = 100MHz, 1 = 160MHz&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Marcus Comstedt</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=Saleae_Logic16/Firmware&amp;diff=6899</id>
		<title>Saleae Logic16/Firmware</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=Saleae_Logic16/Firmware&amp;diff=6899"/>
		<updated>2013-07-31T19:38:47Z</updated>

		<summary type="html">&lt;p&gt;Marcus Comstedt: /* Endpoint 1 OUT (EP1_OUT) handler */  Explain operations 0x7a and 0x7b&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The following information is related to the vendor firmware included with the&lt;br /&gt;
version 1.1.15 of the vendor application &amp;quot;Logic&amp;quot;.&lt;br /&gt;
== Interrupt handlers ==&lt;br /&gt;
The following interrupt handlers are installed.  If the address is absent, it means the handler just returns (RETI) without performing any action.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|RESET&lt;br /&gt;
|0x0000&lt;br /&gt;
|-&lt;br /&gt;
|TF2&lt;br /&gt;
|0x0e65&lt;br /&gt;
|-&lt;br /&gt;
|RESUME&lt;br /&gt;
|0x002e&lt;br /&gt;
|-&lt;br /&gt;
|SUDAV&lt;br /&gt;
|0x0ae8&lt;br /&gt;
|-&lt;br /&gt;
|SOF&lt;br /&gt;
|0x13d2&lt;br /&gt;
|-&lt;br /&gt;
|SUTOK&lt;br /&gt;
|0x13bf&lt;br /&gt;
|-&lt;br /&gt;
|SUSPEND&lt;br /&gt;
|0x13aa&lt;br /&gt;
|-&lt;br /&gt;
|USB_RESET&lt;br /&gt;
|0x130b&lt;br /&gt;
|-&lt;br /&gt;
|HISPEED&lt;br /&gt;
|0x12df&lt;br /&gt;
|-&lt;br /&gt;
|EP0ACK&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP0_IN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP0_OUT&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP1_IN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP1_OUT&lt;br /&gt;
|0x115d&lt;br /&gt;
|-&lt;br /&gt;
|EP2&lt;br /&gt;
|0x11a2&lt;br /&gt;
|-&lt;br /&gt;
|EP4&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|IBN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP0PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP1PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|ERRLIMIT&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2ISOERR&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4ISOERRF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6ISOERR&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8ISOERRF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2FF&lt;br /&gt;
|0x11e7&lt;br /&gt;
|-&lt;br /&gt;
|EP4FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|GPIFDONE&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|GPIFWF&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Endpoint 1 OUT (EP1_OUT) handler ===&lt;br /&gt;
&lt;br /&gt;
After decrypting the OUT packet, processing of the packet proceeds depending on the first byte of the packet, which selects the operation.  After the operation, any resulting IN packet will be encrypted before submitting it to the host.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Byte&lt;br /&gt;
! Handler&lt;br /&gt;
! Operation&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 0x14f&lt;br /&gt;
| Configure endpoints for quad-buffered bulk FIFO operation, and trigger a GPIF read on EP2.&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 0x157&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| 0x15f&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| 0x1b3&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7a&lt;br /&gt;
| 0x309&lt;br /&gt;
| Upload the sine table for LED flashing.  The second byte contains the offset to start writing at, and the third byte the number of bytes to write.  A maximum of 61 bytes can be uploaded per packet, so two packets are needed to write the entire table.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7b&lt;br /&gt;
| 0x346&lt;br /&gt;
| Enable or disable LED flashing.  The second byte of the packet is a bool indicating if LED flashing should be enabled.  The following bytes are only used if LED flashing is enabled, but are always transmitted.  If flashing is enabled, the LED brighness will periodically be set from the sine table.  Byte 3 and 4 of the packet are the Timer 2 reload value, in little endian format.  Byte 5 is a software clock divisor.  The pointer in the sine table will be advanced by one every (0x10000-RELOAD)*(DIV+1)/4000000 seconds.  Byte 6 is a boolean indicating whether to repeat the waveform (1) or stop at the end of the first period (0).&lt;br /&gt;
|-&lt;br /&gt;
| 0x7c&lt;br /&gt;
| 0x282&lt;br /&gt;
| Re-renumerate; return control to the builtin bootloader.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7d&lt;br /&gt;
| 0x2aa&lt;br /&gt;
| Abort the GPIF.  The second byte of the packet is returned complemented in an IN transfer, as acknowledgement.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7e&lt;br /&gt;
| 0x2cf&lt;br /&gt;
| Disable LED flashing, configure the GPIF, and prepare the FPGA for bitstream upload by pulsing PROG_B and then waiting for INIT_B.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7f&lt;br /&gt;
| 0x2e4&lt;br /&gt;
| Disable LED flashing, transmit N (1-62) bytes of bitstream on the FPGA DIN pin, clocked by CCLK.  The second byte of the packet encodes N.&lt;br /&gt;
|-&lt;br /&gt;
| 0x80&lt;br /&gt;
| 0x205&lt;br /&gt;
| Transmit N (1-31) 16-bit words to the FPGA.  The second byte of the packet encodes N. Data is sent on PA6, MSB first, with rising edges of PA5 to clock the bits out. During each word transfer, PA4 is held low.  The most significant bit (b15) of each word must be 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x81&lt;br /&gt;
| 0x23b&lt;br /&gt;
| Perform N (1-31) write-read transactions to the FPGA.  The second byte of the packet encodes N.  Each transaction consists of 8 bits (from the out packet) being transmitted on PA6, like for the 0x80 operation above, and then 8 bits being received on PA7.  N bytes will be available for an IN transfer afterwards.  The most significant bit (b7) of each byte to send must be 0, but is actually transmitted as a 1 (to indicate read operation).  PA7 is polled immediately after the falling edge of PA5.  PA4 is held low during each write-read transaction.&lt;br /&gt;
|-&lt;br /&gt;
| 0x82&lt;br /&gt;
| 0x3a3&lt;br /&gt;
| Read the REVID register.  16 bits of REVID data will be available for an IN transfer.&lt;br /&gt;
|-&lt;br /&gt;
| others&lt;br /&gt;
| 0x3c7&lt;br /&gt;
| Do nothing&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Command 0x7e waveform ====&lt;br /&gt;
[[File:Logic16 FW Command 0x7e Waveform.svg]]&lt;br /&gt;
==== Command 0x7f waveform ====&lt;br /&gt;
[[File:Logic16 FW Command 0x7f Waveform.svg]]&lt;br /&gt;
==== Command 0x80 waveform ====&lt;br /&gt;
[[File:Logic16 FW Command 0x80 Waveform.svg]]&lt;br /&gt;
==== Command 0x81 waveform ====&lt;br /&gt;
[[File:Logic16 FW Command 0x81 Waveform.svg]]&lt;br /&gt;
&lt;br /&gt;
== XDATA variables ==&lt;br /&gt;
The following variables are stored in the 8K &amp;quot;external&amp;quot; code/data memory, after the firmware code.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!rowspan=&amp;quot;2&amp;quot;|Address&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Init data in FW&lt;br /&gt;
!rowspan=&amp;quot;2&amp;quot;|Contents&lt;br /&gt;
|-&lt;br /&gt;
!Address&lt;br /&gt;
!Value&lt;br /&gt;
|-&lt;br /&gt;
|0x1f00-0x1f7f&lt;br /&gt;
|0x8d6-0x955&lt;br /&gt;
|&lt;br /&gt;
|WAVEDATA&lt;br /&gt;
|-&lt;br /&gt;
|0x1f80&lt;br /&gt;
|0x981&lt;br /&gt;
|0xe0&lt;br /&gt;
|GPIFREADYCFG&lt;br /&gt;
|-&lt;br /&gt;
|0x1f81&lt;br /&gt;
|0x982&lt;br /&gt;
|0x10&lt;br /&gt;
|GPIFCTLCFG&lt;br /&gt;
|-&lt;br /&gt;
|0x1f82&lt;br /&gt;
|0x983&lt;br /&gt;
|0x00&lt;br /&gt;
|GPIFIDLECS&lt;br /&gt;
|-&lt;br /&gt;
|0x1f83&lt;br /&gt;
|0x984&lt;br /&gt;
|0x05&lt;br /&gt;
|GPIFIDLECTL&lt;br /&gt;
|-&lt;br /&gt;
|0x1f84&lt;br /&gt;
|0x985&lt;br /&gt;
|0xee&lt;br /&gt;
|?&lt;br /&gt;
|-&lt;br /&gt;
|0x1f85&lt;br /&gt;
|0x986&lt;br /&gt;
|0x50&lt;br /&gt;
|GPIFWFSELECT&lt;br /&gt;
|-&lt;br /&gt;
|0x1f86&lt;br /&gt;
|0x987&lt;br /&gt;
|0x00&lt;br /&gt;
|GPIFREADYSTAT&lt;br /&gt;
|-&lt;br /&gt;
|0x1f87-0x1faa&lt;br /&gt;
|0x95a-0x97d&lt;br /&gt;
|&lt;br /&gt;
|?&lt;br /&gt;
|-&lt;br /&gt;
|0x1fab-0x1fea&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|64 byte sine table for LED flashing&lt;br /&gt;
|}&lt;br /&gt;
=== WAVEDATA ===&lt;br /&gt;
The following data is loaded into WAVEDATA on bootup, and whenever operation 0x7e is performed:&lt;br /&gt;
==== Waveform descriptor 0 ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!State&lt;br /&gt;
!Length/Branch&lt;br /&gt;
!Opcode&lt;br /&gt;
!Output&lt;br /&gt;
!Logic&lt;br /&gt;
!Operation&lt;br /&gt;
!NEXT&lt;br /&gt;
!DATA&lt;br /&gt;
!CTL2&lt;br /&gt;
!CTL1&lt;br /&gt;
!CTL0&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|0x81&lt;br /&gt;
|0x01  &lt;br /&gt;
|0x05  &lt;br /&gt;
|0x70&lt;br /&gt;
|if FF or RDY0 then 0 (ReExec) else 1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|0xB8  &lt;br /&gt;
|0x07  &lt;br /&gt;
|0x04  &lt;br /&gt;
|0x2D&lt;br /&gt;
|if TC expired then 7 else 0&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|0x01  &lt;br /&gt;
|0x02  &lt;br /&gt;
|0x04  &lt;br /&gt;
|0x00  &lt;br /&gt;
|Delay 1&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|0x01  &lt;br /&gt;
|0x02  &lt;br /&gt;
|0x04  &lt;br /&gt;
|0x00  &lt;br /&gt;
|Delay 1&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|0x01  &lt;br /&gt;
|0x02  &lt;br /&gt;
|0x04  &lt;br /&gt;
|0x00  &lt;br /&gt;
|Delay 1&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|5&lt;br /&gt;
|0x01  &lt;br /&gt;
|0x02  &lt;br /&gt;
|0x04  &lt;br /&gt;
|0x00  &lt;br /&gt;
|Delay 1&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|6&lt;br /&gt;
|0x01  &lt;br /&gt;
|0x02  &lt;br /&gt;
|0x04  &lt;br /&gt;
|0x00  &lt;br /&gt;
|Delay 1&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Waveform descriptor 1-3 ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!State&lt;br /&gt;
!Length/Branch&lt;br /&gt;
!Opcode&lt;br /&gt;
!Output&lt;br /&gt;
!Logic&lt;br /&gt;
!Operation&lt;br /&gt;
!NEXT&lt;br /&gt;
!DATA&lt;br /&gt;
!CTL2&lt;br /&gt;
!CTL1&lt;br /&gt;
!CTL0&lt;br /&gt;
|-&lt;br /&gt;
|0-6&lt;br /&gt;
|0x01&lt;br /&gt;
|0x00&lt;br /&gt;
|0x05&lt;br /&gt;
|0x00&lt;br /&gt;
|Delay 1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== FPGA variables ==&lt;br /&gt;
The following variables can be read and written by the host using operations 0x81 and 0x80:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Address&lt;br /&gt;
! Contents&lt;br /&gt;
|-&lt;br /&gt;
|0x02&lt;br /&gt;
|Channel select low.  Each 1 bit in this byte enables one of the channels 0-7 for acquisition.&lt;br /&gt;
|-&lt;br /&gt;
|0x03&lt;br /&gt;
|Channel select high.  Each 1 bit in this byte enables one of the channels 8-15 for acquisition.&lt;br /&gt;
|-&lt;br /&gt;
|0x04&lt;br /&gt;
|Sampling rate divisor.  Sample rate is the base clock divided by N+1, where N is the value in this register.&lt;br /&gt;
|-&lt;br /&gt;
|0x05&lt;br /&gt;
|LED brightness.  0 = min (off), 0xff = max, 0x19 = dimmed.&lt;br /&gt;
|-&lt;br /&gt;
|0x0a&lt;br /&gt;
|Sampling base clock select: 0 = 100MHz, 1 = 160MHz&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Marcus Comstedt</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=Saleae_Logic16/Firmware&amp;diff=6898</id>
		<title>Saleae Logic16/Firmware</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=Saleae_Logic16/Firmware&amp;diff=6898"/>
		<updated>2013-07-31T17:58:30Z</updated>

		<summary type="html">&lt;p&gt;Marcus Comstedt: /* FPGA variables */ Add LED brightness variable&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The following information is related to the vendor firmware included with the&lt;br /&gt;
version 1.1.15 of the vendor application &amp;quot;Logic&amp;quot;.&lt;br /&gt;
== Interrupt handlers ==&lt;br /&gt;
The following interrupt handlers are installed.  If the address is absent, it means the handler just returns (RETI) without performing any action.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|RESET&lt;br /&gt;
|0x0000&lt;br /&gt;
|-&lt;br /&gt;
|TF2&lt;br /&gt;
|0x0e65&lt;br /&gt;
|-&lt;br /&gt;
|RESUME&lt;br /&gt;
|0x002e&lt;br /&gt;
|-&lt;br /&gt;
|SUDAV&lt;br /&gt;
|0x0ae8&lt;br /&gt;
|-&lt;br /&gt;
|SOF&lt;br /&gt;
|0x13d2&lt;br /&gt;
|-&lt;br /&gt;
|SUTOK&lt;br /&gt;
|0x13bf&lt;br /&gt;
|-&lt;br /&gt;
|SUSPEND&lt;br /&gt;
|0x13aa&lt;br /&gt;
|-&lt;br /&gt;
|USB_RESET&lt;br /&gt;
|0x130b&lt;br /&gt;
|-&lt;br /&gt;
|HISPEED&lt;br /&gt;
|0x12df&lt;br /&gt;
|-&lt;br /&gt;
|EP0ACK&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP0_IN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP0_OUT&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP1_IN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP1_OUT&lt;br /&gt;
|0x115d&lt;br /&gt;
|-&lt;br /&gt;
|EP2&lt;br /&gt;
|0x11a2&lt;br /&gt;
|-&lt;br /&gt;
|EP4&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|IBN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP0PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP1PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|ERRLIMIT&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2ISOERR&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4ISOERRF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6ISOERR&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8ISOERRF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2FF&lt;br /&gt;
|0x11e7&lt;br /&gt;
|-&lt;br /&gt;
|EP4FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|GPIFDONE&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|GPIFWF&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Endpoint 1 OUT (EP1_OUT) handler ===&lt;br /&gt;
&lt;br /&gt;
After decrypting the OUT packet, processing of the packet proceeds depending on the first byte of the packet, which selects the operation.  After the operation, any resulting IN packet will be encrypted before submitting it to the host.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Byte&lt;br /&gt;
! Handler&lt;br /&gt;
! Operation&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 0x14f&lt;br /&gt;
| Configure endpoints for quad-buffered bulk FIFO operation, and trigger a GPIF read on EP2.&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 0x157&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| 0x15f&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| 0x1b3&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7a&lt;br /&gt;
| 0x309&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7b&lt;br /&gt;
| 0x346&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7c&lt;br /&gt;
| 0x282&lt;br /&gt;
| Re-renumerate; return control to the builtin bootloader.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7d&lt;br /&gt;
| 0x2aa&lt;br /&gt;
| Abort the GPIF.  The second byte of the packet is returned complemented in an IN transfer, as acknowledgement.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7e&lt;br /&gt;
| 0x2cf&lt;br /&gt;
| Configure the GPIF, and prepare the FPGA for bitstream upload by pulsing PROG_B and then waiting for INIT_B.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7f&lt;br /&gt;
| 0x2e4&lt;br /&gt;
| Transmit N (1-62) bytes of bitstream on the FPGA DIN pin, clocked by CCLK.  The second byte of the packet encodes N.&lt;br /&gt;
|-&lt;br /&gt;
| 0x80&lt;br /&gt;
| 0x205&lt;br /&gt;
| Transmit N (1-31) 16-bit words to the FPGA.  The second byte of the packet encodes N. Data is sent on PA6, MSB first, with rising edges of PA5 to clock the bits out. During each word transfer, PA4 is held low.  The most significant bit (b15) of each word must be 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x81&lt;br /&gt;
| 0x23b&lt;br /&gt;
| Perform N (1-31) write-read transactions to the FPGA.  The second byte of the packet encodes N.  Each transaction consists of 8 bits (from the out packet) being transmitted on PA6, like for the 0x80 operation above, and then 8 bits being received on PA7.  N bytes will be available for an IN transfer afterwards.  The most significant bit (b7) of each byte to send must be 0, but is actually transmitted as a 1 (to indicate read operation).  PA7 is polled immediately after the falling edge of PA5.  PA4 is held low during each write-read transaction.&lt;br /&gt;
|-&lt;br /&gt;
| 0x82&lt;br /&gt;
| 0x3a3&lt;br /&gt;
| Read the REVID register.  16 bits of REVID data will be available for an IN transfer.&lt;br /&gt;
|-&lt;br /&gt;
| others&lt;br /&gt;
| 0x3c7&lt;br /&gt;
| Do nothing&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Command 0x7e waveform ====&lt;br /&gt;
[[File:Logic16 FW Command 0x7e Waveform.svg]]&lt;br /&gt;
==== Command 0x7f waveform ====&lt;br /&gt;
[[File:Logic16 FW Command 0x7f Waveform.svg]]&lt;br /&gt;
==== Command 0x80 waveform ====&lt;br /&gt;
[[File:Logic16 FW Command 0x80 Waveform.svg]]&lt;br /&gt;
==== Command 0x81 waveform ====&lt;br /&gt;
[[File:Logic16 FW Command 0x81 Waveform.svg]]&lt;br /&gt;
&lt;br /&gt;
== XDATA variables ==&lt;br /&gt;
The following variables are stored in the 8K &amp;quot;external&amp;quot; code/data memory, after the firmware code.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!rowspan=&amp;quot;2&amp;quot;|Address&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Init data in FW&lt;br /&gt;
!rowspan=&amp;quot;2&amp;quot;|Contents&lt;br /&gt;
|-&lt;br /&gt;
!Address&lt;br /&gt;
!Value&lt;br /&gt;
|-&lt;br /&gt;
|0x1f00-0x1f7f&lt;br /&gt;
|0x8d6-0x955&lt;br /&gt;
|&lt;br /&gt;
|WAVEDATA&lt;br /&gt;
|-&lt;br /&gt;
|0x1f80&lt;br /&gt;
|0x981&lt;br /&gt;
|0xe0&lt;br /&gt;
|GPIFREADYCFG&lt;br /&gt;
|-&lt;br /&gt;
|0x1f81&lt;br /&gt;
|0x982&lt;br /&gt;
|0x10&lt;br /&gt;
|GPIFCTLCFG&lt;br /&gt;
|-&lt;br /&gt;
|0x1f82&lt;br /&gt;
|0x983&lt;br /&gt;
|0x00&lt;br /&gt;
|GPIFIDLECS&lt;br /&gt;
|-&lt;br /&gt;
|0x1f83&lt;br /&gt;
|0x984&lt;br /&gt;
|0x05&lt;br /&gt;
|GPIFIDLECTL&lt;br /&gt;
|-&lt;br /&gt;
|0x1f84&lt;br /&gt;
|0x985&lt;br /&gt;
|0xee&lt;br /&gt;
|?&lt;br /&gt;
|-&lt;br /&gt;
|0x1f85&lt;br /&gt;
|0x986&lt;br /&gt;
|0x50&lt;br /&gt;
|GPIFWFSELECT&lt;br /&gt;
|-&lt;br /&gt;
|0x1f86&lt;br /&gt;
|0x987&lt;br /&gt;
|0x00&lt;br /&gt;
|GPIFREADYSTAT&lt;br /&gt;
|-&lt;br /&gt;
|0x1f87-0x1faa&lt;br /&gt;
|0x95a-0x97d&lt;br /&gt;
|&lt;br /&gt;
|?&lt;br /&gt;
|-&lt;br /&gt;
|0x1fab-0x1fea&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|?&lt;br /&gt;
|}&lt;br /&gt;
=== WAVEDATA ===&lt;br /&gt;
The following data is loaded into WAVEDATA on bootup, and whenever operation 0x7e is performed:&lt;br /&gt;
==== Waveform descriptor 0 ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!State&lt;br /&gt;
!Length/Branch&lt;br /&gt;
!Opcode&lt;br /&gt;
!Output&lt;br /&gt;
!Logic&lt;br /&gt;
!Operation&lt;br /&gt;
!NEXT&lt;br /&gt;
!DATA&lt;br /&gt;
!CTL2&lt;br /&gt;
!CTL1&lt;br /&gt;
!CTL0&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|0x81&lt;br /&gt;
|0x01  &lt;br /&gt;
|0x05  &lt;br /&gt;
|0x70&lt;br /&gt;
|if FF or RDY0 then 0 (ReExec) else 1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|0xB8  &lt;br /&gt;
|0x07  &lt;br /&gt;
|0x04  &lt;br /&gt;
|0x2D&lt;br /&gt;
|if TC expired then 7 else 0&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|0x01  &lt;br /&gt;
|0x02  &lt;br /&gt;
|0x04  &lt;br /&gt;
|0x00  &lt;br /&gt;
|Delay 1&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|0x01  &lt;br /&gt;
|0x02  &lt;br /&gt;
|0x04  &lt;br /&gt;
|0x00  &lt;br /&gt;
|Delay 1&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|0x01  &lt;br /&gt;
|0x02  &lt;br /&gt;
|0x04  &lt;br /&gt;
|0x00  &lt;br /&gt;
|Delay 1&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|5&lt;br /&gt;
|0x01  &lt;br /&gt;
|0x02  &lt;br /&gt;
|0x04  &lt;br /&gt;
|0x00  &lt;br /&gt;
|Delay 1&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|6&lt;br /&gt;
|0x01  &lt;br /&gt;
|0x02  &lt;br /&gt;
|0x04  &lt;br /&gt;
|0x00  &lt;br /&gt;
|Delay 1&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Waveform descriptor 1-3 ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!State&lt;br /&gt;
!Length/Branch&lt;br /&gt;
!Opcode&lt;br /&gt;
!Output&lt;br /&gt;
!Logic&lt;br /&gt;
!Operation&lt;br /&gt;
!NEXT&lt;br /&gt;
!DATA&lt;br /&gt;
!CTL2&lt;br /&gt;
!CTL1&lt;br /&gt;
!CTL0&lt;br /&gt;
|-&lt;br /&gt;
|0-6&lt;br /&gt;
|0x01&lt;br /&gt;
|0x00&lt;br /&gt;
|0x05&lt;br /&gt;
|0x00&lt;br /&gt;
|Delay 1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== FPGA variables ==&lt;br /&gt;
The following variables can be read and written by the host using operations 0x81 and 0x80:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Address&lt;br /&gt;
! Contents&lt;br /&gt;
|-&lt;br /&gt;
|0x02&lt;br /&gt;
|Channel select low.  Each 1 bit in this byte enables one of the channels 0-7 for acquisition.&lt;br /&gt;
|-&lt;br /&gt;
|0x03&lt;br /&gt;
|Channel select high.  Each 1 bit in this byte enables one of the channels 8-15 for acquisition.&lt;br /&gt;
|-&lt;br /&gt;
|0x04&lt;br /&gt;
|Sampling rate divisor.  Sample rate is the base clock divided by N+1, where N is the value in this register.&lt;br /&gt;
|-&lt;br /&gt;
|0x05&lt;br /&gt;
|LED brightness.  0 = min (off), 0xff = max, 0x19 = dimmed.&lt;br /&gt;
|-&lt;br /&gt;
|0x0a&lt;br /&gt;
|Sampling base clock select: 0 = 100MHz, 1 = 160MHz&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Marcus Comstedt</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=Saleae_Logic16/Firmware&amp;diff=6847</id>
		<title>Saleae Logic16/Firmware</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=Saleae_Logic16/Firmware&amp;diff=6847"/>
		<updated>2013-07-29T11:57:35Z</updated>

		<summary type="html">&lt;p&gt;Marcus Comstedt: /* Waveform descriptor 1-3 */ Expand the other waveform descriptors too&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The following information is related to the vendor firmware included with the&lt;br /&gt;
version 1.1.15 of the vendor application &amp;quot;Logic&amp;quot;.&lt;br /&gt;
== Interrupt handlers ==&lt;br /&gt;
The following interrupt handlers are installed.  If the address is absent, it means the handler just returns (RETI) without performing any action.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|RESET&lt;br /&gt;
|0x0000&lt;br /&gt;
|-&lt;br /&gt;
|TF2&lt;br /&gt;
|0x0e65&lt;br /&gt;
|-&lt;br /&gt;
|RESUME&lt;br /&gt;
|0x002e&lt;br /&gt;
|-&lt;br /&gt;
|SUDAV&lt;br /&gt;
|0x0ae8&lt;br /&gt;
|-&lt;br /&gt;
|SOF&lt;br /&gt;
|0x13d2&lt;br /&gt;
|-&lt;br /&gt;
|SUTOK&lt;br /&gt;
|0x13bf&lt;br /&gt;
|-&lt;br /&gt;
|SUSPEND&lt;br /&gt;
|0x13aa&lt;br /&gt;
|-&lt;br /&gt;
|USB_RESET&lt;br /&gt;
|0x130b&lt;br /&gt;
|-&lt;br /&gt;
|HISPEED&lt;br /&gt;
|0x12df&lt;br /&gt;
|-&lt;br /&gt;
|EP0ACK&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP0_IN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP0_OUT&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP1_IN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP1_OUT&lt;br /&gt;
|0x115d&lt;br /&gt;
|-&lt;br /&gt;
|EP2&lt;br /&gt;
|0x11a2&lt;br /&gt;
|-&lt;br /&gt;
|EP4&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|IBN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP0PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP1PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|ERRLIMIT&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2ISOERR&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4ISOERRF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6ISOERR&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8ISOERRF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2FF&lt;br /&gt;
|0x11e7&lt;br /&gt;
|-&lt;br /&gt;
|EP4FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|GPIFDONE&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|GPIFWF&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Endpoint 1 OUT (EP1_OUT) handler ===&lt;br /&gt;
&lt;br /&gt;
After decrypting the OUT packet, processing of the packet proceeds depending on the first byte of the packet, which selects the operation.  After the operation, any resulting IN packet will be encrypted before submitting it to the host.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Byte&lt;br /&gt;
! Handler&lt;br /&gt;
! Operation&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 0x14f&lt;br /&gt;
| Configure endpoints for quad-buffered bulk FIFO operation, and trigger a GPIF read on EP2.&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 0x157&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| 0x15f&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| 0x1b3&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7a&lt;br /&gt;
| 0x309&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7b&lt;br /&gt;
| 0x346&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7c&lt;br /&gt;
| 0x282&lt;br /&gt;
| Re-renumerate; return control to the builtin bootloader.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7d&lt;br /&gt;
| 0x2aa&lt;br /&gt;
| Abort the GPIF.  The second byte of the packet is returned complemented in an IN transfer, as acknowledgement.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7e&lt;br /&gt;
| 0x2cf&lt;br /&gt;
| Configure the GPIF, and prepare the FPGA for bitstream upload by pulsing PROG_B and then waiting for INIT_B.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7f&lt;br /&gt;
| 0x2e4&lt;br /&gt;
| Transmit N (1-62) bytes of bitstream on the FPGA DIN pin, clocked by CCLK.  The second byte of the packet encodes N.&lt;br /&gt;
|-&lt;br /&gt;
| 0x80&lt;br /&gt;
| 0x205&lt;br /&gt;
| Transmit N (1-31) 16-bit words to the FPGA.  The second byte of the packet encodes N. Data is sent on PA6, MSB first, with rising edges of PA5 to clock the bits out. During each word transfer, PA4 is held low.  The most significant bit (b15) of each word must be 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x81&lt;br /&gt;
| 0x23b&lt;br /&gt;
| Perform N (1-31) write-read transactions to the FPGA.  The second byte of the packet encodes N.  Each transaction consists of 8 bits (from the out packet) being transmitted on PA6, like for the 0x80 operation above, and then 8 bits being received on PA7.  N bytes will be available for an IN transfer afterwards.  The most significant bit (b7) of each byte to send must be 0, but is actually transmitted as a 1 (to indicate read operation).  PA7 is polled immediately after the falling edge of PA5.  PA4 is held low during each write-read transaction.&lt;br /&gt;
|-&lt;br /&gt;
| 0x82&lt;br /&gt;
| 0x3a3&lt;br /&gt;
| Read the REVID register.  16 bits of REVID data will be available for an IN transfer.&lt;br /&gt;
|-&lt;br /&gt;
| others&lt;br /&gt;
| 0x3c7&lt;br /&gt;
| Do nothing&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Command 0x7e waveform ====&lt;br /&gt;
[[File:Logic16 FW Command 0x7e Waveform.svg]]&lt;br /&gt;
==== Command 0x7f waveform ====&lt;br /&gt;
[[File:Logic16 FW Command 0x7f Waveform.svg]]&lt;br /&gt;
==== Command 0x80 waveform ====&lt;br /&gt;
[[File:Logic16 FW Command 0x80 Waveform.svg]]&lt;br /&gt;
==== Command 0x81 waveform ====&lt;br /&gt;
[[File:Logic16 FW Command 0x81 Waveform.svg]]&lt;br /&gt;
&lt;br /&gt;
== XDATA variables ==&lt;br /&gt;
The following variables are stored in the 8K &amp;quot;external&amp;quot; code/data memory, after the firmware code.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!rowspan=&amp;quot;2&amp;quot;|Address&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Init data in FW&lt;br /&gt;
!rowspan=&amp;quot;2&amp;quot;|Contents&lt;br /&gt;
|-&lt;br /&gt;
!Address&lt;br /&gt;
!Value&lt;br /&gt;
|-&lt;br /&gt;
|0x1f00-0x1f7f&lt;br /&gt;
|0x8d6-0x955&lt;br /&gt;
|&lt;br /&gt;
|WAVEDATA&lt;br /&gt;
|-&lt;br /&gt;
|0x1f80&lt;br /&gt;
|0x981&lt;br /&gt;
|0xe0&lt;br /&gt;
|GPIFREADYCFG&lt;br /&gt;
|-&lt;br /&gt;
|0x1f81&lt;br /&gt;
|0x982&lt;br /&gt;
|0x10&lt;br /&gt;
|GPIFCTLCFG&lt;br /&gt;
|-&lt;br /&gt;
|0x1f82&lt;br /&gt;
|0x983&lt;br /&gt;
|0x00&lt;br /&gt;
|GPIFIDLECS&lt;br /&gt;
|-&lt;br /&gt;
|0x1f83&lt;br /&gt;
|0x984&lt;br /&gt;
|0x05&lt;br /&gt;
|GPIFIDLECTL&lt;br /&gt;
|-&lt;br /&gt;
|0x1f84&lt;br /&gt;
|0x985&lt;br /&gt;
|0xee&lt;br /&gt;
|?&lt;br /&gt;
|-&lt;br /&gt;
|0x1f85&lt;br /&gt;
|0x986&lt;br /&gt;
|0x50&lt;br /&gt;
|GPIFWFSELECT&lt;br /&gt;
|-&lt;br /&gt;
|0x1f86&lt;br /&gt;
|0x987&lt;br /&gt;
|0x00&lt;br /&gt;
|GPIFREADYSTAT&lt;br /&gt;
|-&lt;br /&gt;
|0x1f87-0x1faa&lt;br /&gt;
|0x95a-0x97d&lt;br /&gt;
|&lt;br /&gt;
|?&lt;br /&gt;
|-&lt;br /&gt;
|0x1fab-0x1fea&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|?&lt;br /&gt;
|}&lt;br /&gt;
=== WAVEDATA ===&lt;br /&gt;
The following data is loaded into WAVEDATA on bootup, and whenever operation 0x7e is performed:&lt;br /&gt;
==== Waveform descriptor 0 ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!State&lt;br /&gt;
!Length/Branch&lt;br /&gt;
!Opcode&lt;br /&gt;
!Output&lt;br /&gt;
!Logic&lt;br /&gt;
!Operation&lt;br /&gt;
!NEXT&lt;br /&gt;
!DATA&lt;br /&gt;
!CTL2&lt;br /&gt;
!CTL1&lt;br /&gt;
!CTL0&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|0x81&lt;br /&gt;
|0x01  &lt;br /&gt;
|0x05  &lt;br /&gt;
|0x70&lt;br /&gt;
|if FF or RDY0 then 0 (ReExec) else 1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|0xB8  &lt;br /&gt;
|0x07  &lt;br /&gt;
|0x04  &lt;br /&gt;
|0x2D&lt;br /&gt;
|if TC expired then 7 else 0&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|0x01  &lt;br /&gt;
|0x02  &lt;br /&gt;
|0x04  &lt;br /&gt;
|0x00  &lt;br /&gt;
|Delay 1&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|0x01  &lt;br /&gt;
|0x02  &lt;br /&gt;
|0x04  &lt;br /&gt;
|0x00  &lt;br /&gt;
|Delay 1&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|0x01  &lt;br /&gt;
|0x02  &lt;br /&gt;
|0x04  &lt;br /&gt;
|0x00  &lt;br /&gt;
|Delay 1&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|5&lt;br /&gt;
|0x01  &lt;br /&gt;
|0x02  &lt;br /&gt;
|0x04  &lt;br /&gt;
|0x00  &lt;br /&gt;
|Delay 1&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|6&lt;br /&gt;
|0x01  &lt;br /&gt;
|0x02  &lt;br /&gt;
|0x04  &lt;br /&gt;
|0x00  &lt;br /&gt;
|Delay 1&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Waveform descriptor 1-3 ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!State&lt;br /&gt;
!Length/Branch&lt;br /&gt;
!Opcode&lt;br /&gt;
!Output&lt;br /&gt;
!Logic&lt;br /&gt;
!Operation&lt;br /&gt;
!NEXT&lt;br /&gt;
!DATA&lt;br /&gt;
!CTL2&lt;br /&gt;
!CTL1&lt;br /&gt;
!CTL0&lt;br /&gt;
|-&lt;br /&gt;
|0-6&lt;br /&gt;
|0x01&lt;br /&gt;
|0x00&lt;br /&gt;
|0x05&lt;br /&gt;
|0x00&lt;br /&gt;
|Delay 1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== FPGA variables ==&lt;br /&gt;
The following variables can be read and written by the host using operations 0x81 and 0x80:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Address&lt;br /&gt;
! Contents&lt;br /&gt;
|-&lt;br /&gt;
|0x02&lt;br /&gt;
|Channel select low.  Each 1 bit in this byte enables one of the channels 0-7 for acquisition.&lt;br /&gt;
|-&lt;br /&gt;
|0x03&lt;br /&gt;
|Channel select high.  Each 1 bit in this byte enables one of the channels 8-15 for acquisition.&lt;br /&gt;
|-&lt;br /&gt;
|0x04&lt;br /&gt;
|Sampling rate divisor.  Sample rate is the base clock divided by N+1, where N is the value in this register.&lt;br /&gt;
|-&lt;br /&gt;
|0x0a&lt;br /&gt;
|Sampling base clock select: 0 = 100MHz, 1 = 160MHz&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Marcus Comstedt</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=Saleae_Logic16/Firmware&amp;diff=6846</id>
		<title>Saleae Logic16/Firmware</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=Saleae_Logic16/Firmware&amp;diff=6846"/>
		<updated>2013-07-29T11:53:20Z</updated>

		<summary type="html">&lt;p&gt;Marcus Comstedt: /* Waveform descriptor 0 */ Expand waveform descriptor 0&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The following information is related to the vendor firmware included with the&lt;br /&gt;
version 1.1.15 of the vendor application &amp;quot;Logic&amp;quot;.&lt;br /&gt;
== Interrupt handlers ==&lt;br /&gt;
The following interrupt handlers are installed.  If the address is absent, it means the handler just returns (RETI) without performing any action.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|RESET&lt;br /&gt;
|0x0000&lt;br /&gt;
|-&lt;br /&gt;
|TF2&lt;br /&gt;
|0x0e65&lt;br /&gt;
|-&lt;br /&gt;
|RESUME&lt;br /&gt;
|0x002e&lt;br /&gt;
|-&lt;br /&gt;
|SUDAV&lt;br /&gt;
|0x0ae8&lt;br /&gt;
|-&lt;br /&gt;
|SOF&lt;br /&gt;
|0x13d2&lt;br /&gt;
|-&lt;br /&gt;
|SUTOK&lt;br /&gt;
|0x13bf&lt;br /&gt;
|-&lt;br /&gt;
|SUSPEND&lt;br /&gt;
|0x13aa&lt;br /&gt;
|-&lt;br /&gt;
|USB_RESET&lt;br /&gt;
|0x130b&lt;br /&gt;
|-&lt;br /&gt;
|HISPEED&lt;br /&gt;
|0x12df&lt;br /&gt;
|-&lt;br /&gt;
|EP0ACK&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP0_IN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP0_OUT&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP1_IN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP1_OUT&lt;br /&gt;
|0x115d&lt;br /&gt;
|-&lt;br /&gt;
|EP2&lt;br /&gt;
|0x11a2&lt;br /&gt;
|-&lt;br /&gt;
|EP4&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|IBN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP0PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP1PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|ERRLIMIT&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2ISOERR&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4ISOERRF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6ISOERR&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8ISOERRF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2FF&lt;br /&gt;
|0x11e7&lt;br /&gt;
|-&lt;br /&gt;
|EP4FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|GPIFDONE&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|GPIFWF&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Endpoint 1 OUT (EP1_OUT) handler ===&lt;br /&gt;
&lt;br /&gt;
After decrypting the OUT packet, processing of the packet proceeds depending on the first byte of the packet, which selects the operation.  After the operation, any resulting IN packet will be encrypted before submitting it to the host.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Byte&lt;br /&gt;
! Handler&lt;br /&gt;
! Operation&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 0x14f&lt;br /&gt;
| Configure endpoints for quad-buffered bulk FIFO operation, and trigger a GPIF read on EP2.&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 0x157&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| 0x15f&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| 0x1b3&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7a&lt;br /&gt;
| 0x309&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7b&lt;br /&gt;
| 0x346&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7c&lt;br /&gt;
| 0x282&lt;br /&gt;
| Re-renumerate; return control to the builtin bootloader.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7d&lt;br /&gt;
| 0x2aa&lt;br /&gt;
| Abort the GPIF.  The second byte of the packet is returned complemented in an IN transfer, as acknowledgement.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7e&lt;br /&gt;
| 0x2cf&lt;br /&gt;
| Configure the GPIF, and prepare the FPGA for bitstream upload by pulsing PROG_B and then waiting for INIT_B.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7f&lt;br /&gt;
| 0x2e4&lt;br /&gt;
| Transmit N (1-62) bytes of bitstream on the FPGA DIN pin, clocked by CCLK.  The second byte of the packet encodes N.&lt;br /&gt;
|-&lt;br /&gt;
| 0x80&lt;br /&gt;
| 0x205&lt;br /&gt;
| Transmit N (1-31) 16-bit words to the FPGA.  The second byte of the packet encodes N. Data is sent on PA6, MSB first, with rising edges of PA5 to clock the bits out. During each word transfer, PA4 is held low.  The most significant bit (b15) of each word must be 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x81&lt;br /&gt;
| 0x23b&lt;br /&gt;
| Perform N (1-31) write-read transactions to the FPGA.  The second byte of the packet encodes N.  Each transaction consists of 8 bits (from the out packet) being transmitted on PA6, like for the 0x80 operation above, and then 8 bits being received on PA7.  N bytes will be available for an IN transfer afterwards.  The most significant bit (b7) of each byte to send must be 0, but is actually transmitted as a 1 (to indicate read operation).  PA7 is polled immediately after the falling edge of PA5.  PA4 is held low during each write-read transaction.&lt;br /&gt;
|-&lt;br /&gt;
| 0x82&lt;br /&gt;
| 0x3a3&lt;br /&gt;
| Read the REVID register.  16 bits of REVID data will be available for an IN transfer.&lt;br /&gt;
|-&lt;br /&gt;
| others&lt;br /&gt;
| 0x3c7&lt;br /&gt;
| Do nothing&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Command 0x7e waveform ====&lt;br /&gt;
[[File:Logic16 FW Command 0x7e Waveform.svg]]&lt;br /&gt;
==== Command 0x7f waveform ====&lt;br /&gt;
[[File:Logic16 FW Command 0x7f Waveform.svg]]&lt;br /&gt;
==== Command 0x80 waveform ====&lt;br /&gt;
[[File:Logic16 FW Command 0x80 Waveform.svg]]&lt;br /&gt;
==== Command 0x81 waveform ====&lt;br /&gt;
[[File:Logic16 FW Command 0x81 Waveform.svg]]&lt;br /&gt;
&lt;br /&gt;
== XDATA variables ==&lt;br /&gt;
The following variables are stored in the 8K &amp;quot;external&amp;quot; code/data memory, after the firmware code.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!rowspan=&amp;quot;2&amp;quot;|Address&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Init data in FW&lt;br /&gt;
!rowspan=&amp;quot;2&amp;quot;|Contents&lt;br /&gt;
|-&lt;br /&gt;
!Address&lt;br /&gt;
!Value&lt;br /&gt;
|-&lt;br /&gt;
|0x1f00-0x1f7f&lt;br /&gt;
|0x8d6-0x955&lt;br /&gt;
|&lt;br /&gt;
|WAVEDATA&lt;br /&gt;
|-&lt;br /&gt;
|0x1f80&lt;br /&gt;
|0x981&lt;br /&gt;
|0xe0&lt;br /&gt;
|GPIFREADYCFG&lt;br /&gt;
|-&lt;br /&gt;
|0x1f81&lt;br /&gt;
|0x982&lt;br /&gt;
|0x10&lt;br /&gt;
|GPIFCTLCFG&lt;br /&gt;
|-&lt;br /&gt;
|0x1f82&lt;br /&gt;
|0x983&lt;br /&gt;
|0x00&lt;br /&gt;
|GPIFIDLECS&lt;br /&gt;
|-&lt;br /&gt;
|0x1f83&lt;br /&gt;
|0x984&lt;br /&gt;
|0x05&lt;br /&gt;
|GPIFIDLECTL&lt;br /&gt;
|-&lt;br /&gt;
|0x1f84&lt;br /&gt;
|0x985&lt;br /&gt;
|0xee&lt;br /&gt;
|?&lt;br /&gt;
|-&lt;br /&gt;
|0x1f85&lt;br /&gt;
|0x986&lt;br /&gt;
|0x50&lt;br /&gt;
|GPIFWFSELECT&lt;br /&gt;
|-&lt;br /&gt;
|0x1f86&lt;br /&gt;
|0x987&lt;br /&gt;
|0x00&lt;br /&gt;
|GPIFREADYSTAT&lt;br /&gt;
|-&lt;br /&gt;
|0x1f87-0x1faa&lt;br /&gt;
|0x95a-0x97d&lt;br /&gt;
|&lt;br /&gt;
|?&lt;br /&gt;
|-&lt;br /&gt;
|0x1fab-0x1fea&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|?&lt;br /&gt;
|}&lt;br /&gt;
=== WAVEDATA ===&lt;br /&gt;
The following data is loaded into WAVEDATA on bootup, and whenever operation 0x7e is performed:&lt;br /&gt;
==== Waveform descriptor 0 ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!State&lt;br /&gt;
!Length/Branch&lt;br /&gt;
!Opcode&lt;br /&gt;
!Output&lt;br /&gt;
!Logic&lt;br /&gt;
!Operation&lt;br /&gt;
!NEXT&lt;br /&gt;
!DATA&lt;br /&gt;
!CTL2&lt;br /&gt;
!CTL1&lt;br /&gt;
!CTL0&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|0x81&lt;br /&gt;
|0x01  &lt;br /&gt;
|0x05  &lt;br /&gt;
|0x70&lt;br /&gt;
|if FF or RDY0 then 0 (ReExec) else 1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|0xB8  &lt;br /&gt;
|0x07  &lt;br /&gt;
|0x04  &lt;br /&gt;
|0x2D&lt;br /&gt;
|if TC expired then 7 else 0&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|0x01  &lt;br /&gt;
|0x02  &lt;br /&gt;
|0x04  &lt;br /&gt;
|0x00  &lt;br /&gt;
|Delay 1&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|0x01  &lt;br /&gt;
|0x02  &lt;br /&gt;
|0x04  &lt;br /&gt;
|0x00  &lt;br /&gt;
|Delay 1&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|0x01  &lt;br /&gt;
|0x02  &lt;br /&gt;
|0x04  &lt;br /&gt;
|0x00  &lt;br /&gt;
|Delay 1&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|5&lt;br /&gt;
|0x01  &lt;br /&gt;
|0x02  &lt;br /&gt;
|0x04  &lt;br /&gt;
|0x00  &lt;br /&gt;
|Delay 1&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|6&lt;br /&gt;
|0x01  &lt;br /&gt;
|0x02  &lt;br /&gt;
|0x04  &lt;br /&gt;
|0x00  &lt;br /&gt;
|Delay 1&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Waveform descriptor 1-3 ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!State&lt;br /&gt;
!Length/Branch&lt;br /&gt;
!Opcode&lt;br /&gt;
!Output&lt;br /&gt;
!Logic&lt;br /&gt;
|-&lt;br /&gt;
|0-6&lt;br /&gt;
|0x01&lt;br /&gt;
|0x00&lt;br /&gt;
|0x05&lt;br /&gt;
|0x00&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== FPGA variables ==&lt;br /&gt;
The following variables can be read and written by the host using operations 0x81 and 0x80:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Address&lt;br /&gt;
! Contents&lt;br /&gt;
|-&lt;br /&gt;
|0x02&lt;br /&gt;
|Channel select low.  Each 1 bit in this byte enables one of the channels 0-7 for acquisition.&lt;br /&gt;
|-&lt;br /&gt;
|0x03&lt;br /&gt;
|Channel select high.  Each 1 bit in this byte enables one of the channels 8-15 for acquisition.&lt;br /&gt;
|-&lt;br /&gt;
|0x04&lt;br /&gt;
|Sampling rate divisor.  Sample rate is the base clock divided by N+1, where N is the value in this register.&lt;br /&gt;
|-&lt;br /&gt;
|0x0a&lt;br /&gt;
|Sampling base clock select: 0 = 100MHz, 1 = 160MHz&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Marcus Comstedt</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=Saleae_Logic16/Firmware&amp;diff=6845</id>
		<title>Saleae Logic16/Firmware</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=Saleae_Logic16/Firmware&amp;diff=6845"/>
		<updated>2013-07-29T11:24:48Z</updated>

		<summary type="html">&lt;p&gt;Marcus Comstedt: /* WAVEDATA */ Oops, transposed the WAVEDATA tables...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The following information is related to the vendor firmware included with the&lt;br /&gt;
version 1.1.15 of the vendor application &amp;quot;Logic&amp;quot;.&lt;br /&gt;
== Interrupt handlers ==&lt;br /&gt;
The following interrupt handlers are installed.  If the address is absent, it means the handler just returns (RETI) without performing any action.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|RESET&lt;br /&gt;
|0x0000&lt;br /&gt;
|-&lt;br /&gt;
|TF2&lt;br /&gt;
|0x0e65&lt;br /&gt;
|-&lt;br /&gt;
|RESUME&lt;br /&gt;
|0x002e&lt;br /&gt;
|-&lt;br /&gt;
|SUDAV&lt;br /&gt;
|0x0ae8&lt;br /&gt;
|-&lt;br /&gt;
|SOF&lt;br /&gt;
|0x13d2&lt;br /&gt;
|-&lt;br /&gt;
|SUTOK&lt;br /&gt;
|0x13bf&lt;br /&gt;
|-&lt;br /&gt;
|SUSPEND&lt;br /&gt;
|0x13aa&lt;br /&gt;
|-&lt;br /&gt;
|USB_RESET&lt;br /&gt;
|0x130b&lt;br /&gt;
|-&lt;br /&gt;
|HISPEED&lt;br /&gt;
|0x12df&lt;br /&gt;
|-&lt;br /&gt;
|EP0ACK&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP0_IN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP0_OUT&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP1_IN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP1_OUT&lt;br /&gt;
|0x115d&lt;br /&gt;
|-&lt;br /&gt;
|EP2&lt;br /&gt;
|0x11a2&lt;br /&gt;
|-&lt;br /&gt;
|EP4&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|IBN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP0PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP1PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|ERRLIMIT&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2ISOERR&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4ISOERRF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6ISOERR&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8ISOERRF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2FF&lt;br /&gt;
|0x11e7&lt;br /&gt;
|-&lt;br /&gt;
|EP4FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|GPIFDONE&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|GPIFWF&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Endpoint 1 OUT (EP1_OUT) handler ===&lt;br /&gt;
&lt;br /&gt;
After decrypting the OUT packet, processing of the packet proceeds depending on the first byte of the packet, which selects the operation.  After the operation, any resulting IN packet will be encrypted before submitting it to the host.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Byte&lt;br /&gt;
! Handler&lt;br /&gt;
! Operation&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 0x14f&lt;br /&gt;
| Configure endpoints for quad-buffered bulk FIFO operation, and trigger a GPIF read on EP2.&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 0x157&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| 0x15f&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| 0x1b3&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7a&lt;br /&gt;
| 0x309&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7b&lt;br /&gt;
| 0x346&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7c&lt;br /&gt;
| 0x282&lt;br /&gt;
| Re-renumerate; return control to the builtin bootloader.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7d&lt;br /&gt;
| 0x2aa&lt;br /&gt;
| Abort the GPIF.  The second byte of the packet is returned complemented in an IN transfer, as acknowledgement.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7e&lt;br /&gt;
| 0x2cf&lt;br /&gt;
| Configure the GPIF, and prepare the FPGA for bitstream upload by pulsing PROG_B and then waiting for INIT_B.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7f&lt;br /&gt;
| 0x2e4&lt;br /&gt;
| Transmit N (1-62) bytes of bitstream on the FPGA DIN pin, clocked by CCLK.  The second byte of the packet encodes N.&lt;br /&gt;
|-&lt;br /&gt;
| 0x80&lt;br /&gt;
| 0x205&lt;br /&gt;
| Transmit N (1-31) 16-bit words to the FPGA.  The second byte of the packet encodes N. Data is sent on PA6, MSB first, with rising edges of PA5 to clock the bits out. During each word transfer, PA4 is held low.  The most significant bit (b15) of each word must be 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x81&lt;br /&gt;
| 0x23b&lt;br /&gt;
| Perform N (1-31) write-read transactions to the FPGA.  The second byte of the packet encodes N.  Each transaction consists of 8 bits (from the out packet) being transmitted on PA6, like for the 0x80 operation above, and then 8 bits being received on PA7.  N bytes will be available for an IN transfer afterwards.  The most significant bit (b7) of each byte to send must be 0, but is actually transmitted as a 1 (to indicate read operation).  PA7 is polled immediately after the falling edge of PA5.  PA4 is held low during each write-read transaction.&lt;br /&gt;
|-&lt;br /&gt;
| 0x82&lt;br /&gt;
| 0x3a3&lt;br /&gt;
| Read the REVID register.  16 bits of REVID data will be available for an IN transfer.&lt;br /&gt;
|-&lt;br /&gt;
| others&lt;br /&gt;
| 0x3c7&lt;br /&gt;
| Do nothing&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Command 0x7e waveform ====&lt;br /&gt;
[[File:Logic16 FW Command 0x7e Waveform.svg]]&lt;br /&gt;
==== Command 0x7f waveform ====&lt;br /&gt;
[[File:Logic16 FW Command 0x7f Waveform.svg]]&lt;br /&gt;
==== Command 0x80 waveform ====&lt;br /&gt;
[[File:Logic16 FW Command 0x80 Waveform.svg]]&lt;br /&gt;
==== Command 0x81 waveform ====&lt;br /&gt;
[[File:Logic16 FW Command 0x81 Waveform.svg]]&lt;br /&gt;
&lt;br /&gt;
== XDATA variables ==&lt;br /&gt;
The following variables are stored in the 8K &amp;quot;external&amp;quot; code/data memory, after the firmware code.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!rowspan=&amp;quot;2&amp;quot;|Address&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Init data in FW&lt;br /&gt;
!rowspan=&amp;quot;2&amp;quot;|Contents&lt;br /&gt;
|-&lt;br /&gt;
!Address&lt;br /&gt;
!Value&lt;br /&gt;
|-&lt;br /&gt;
|0x1f00-0x1f7f&lt;br /&gt;
|0x8d6-0x955&lt;br /&gt;
|&lt;br /&gt;
|WAVEDATA&lt;br /&gt;
|-&lt;br /&gt;
|0x1f80&lt;br /&gt;
|0x981&lt;br /&gt;
|0xe0&lt;br /&gt;
|GPIFREADYCFG&lt;br /&gt;
|-&lt;br /&gt;
|0x1f81&lt;br /&gt;
|0x982&lt;br /&gt;
|0x10&lt;br /&gt;
|GPIFCTLCFG&lt;br /&gt;
|-&lt;br /&gt;
|0x1f82&lt;br /&gt;
|0x983&lt;br /&gt;
|0x00&lt;br /&gt;
|GPIFIDLECS&lt;br /&gt;
|-&lt;br /&gt;
|0x1f83&lt;br /&gt;
|0x984&lt;br /&gt;
|0x05&lt;br /&gt;
|GPIFIDLECTL&lt;br /&gt;
|-&lt;br /&gt;
|0x1f84&lt;br /&gt;
|0x985&lt;br /&gt;
|0xee&lt;br /&gt;
|?&lt;br /&gt;
|-&lt;br /&gt;
|0x1f85&lt;br /&gt;
|0x986&lt;br /&gt;
|0x50&lt;br /&gt;
|GPIFWFSELECT&lt;br /&gt;
|-&lt;br /&gt;
|0x1f86&lt;br /&gt;
|0x987&lt;br /&gt;
|0x00&lt;br /&gt;
|GPIFREADYSTAT&lt;br /&gt;
|-&lt;br /&gt;
|0x1f87-0x1faa&lt;br /&gt;
|0x95a-0x97d&lt;br /&gt;
|&lt;br /&gt;
|?&lt;br /&gt;
|-&lt;br /&gt;
|0x1fab-0x1fea&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|?&lt;br /&gt;
|}&lt;br /&gt;
=== WAVEDATA ===&lt;br /&gt;
The following data is loaded into WAVEDATA on bootup, and whenever operation 0x7e is performed:&lt;br /&gt;
==== Waveform descriptor 0 ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!State&lt;br /&gt;
!Length/Branch&lt;br /&gt;
!Opcode&lt;br /&gt;
!Output&lt;br /&gt;
!Logic&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|0x81&lt;br /&gt;
|0x01  &lt;br /&gt;
|0x05  &lt;br /&gt;
|0x70&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|0xB8  &lt;br /&gt;
|0x07  &lt;br /&gt;
|0x04  &lt;br /&gt;
|0x2D&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|0x01  &lt;br /&gt;
|0x02  &lt;br /&gt;
|0x04  &lt;br /&gt;
|0x00  &lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|0x01  &lt;br /&gt;
|0x02  &lt;br /&gt;
|0x04  &lt;br /&gt;
|0x00  &lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|0x01  &lt;br /&gt;
|0x02  &lt;br /&gt;
|0x04  &lt;br /&gt;
|0x00  &lt;br /&gt;
|-&lt;br /&gt;
|5&lt;br /&gt;
|0x01  &lt;br /&gt;
|0x02  &lt;br /&gt;
|0x04  &lt;br /&gt;
|0x00  &lt;br /&gt;
|-&lt;br /&gt;
|6&lt;br /&gt;
|0x01  &lt;br /&gt;
|0x02  &lt;br /&gt;
|0x04  &lt;br /&gt;
|0x00  &lt;br /&gt;
|}&lt;br /&gt;
==== Waveform descriptor 1-3 ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!State&lt;br /&gt;
!Length/Branch&lt;br /&gt;
!Opcode&lt;br /&gt;
!Output&lt;br /&gt;
!Logic&lt;br /&gt;
|-&lt;br /&gt;
|0-6&lt;br /&gt;
|0x01&lt;br /&gt;
|0x00&lt;br /&gt;
|0x05&lt;br /&gt;
|0x00&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== FPGA variables ==&lt;br /&gt;
The following variables can be read and written by the host using operations 0x81 and 0x80:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Address&lt;br /&gt;
! Contents&lt;br /&gt;
|-&lt;br /&gt;
|0x02&lt;br /&gt;
|Channel select low.  Each 1 bit in this byte enables one of the channels 0-7 for acquisition.&lt;br /&gt;
|-&lt;br /&gt;
|0x03&lt;br /&gt;
|Channel select high.  Each 1 bit in this byte enables one of the channels 8-15 for acquisition.&lt;br /&gt;
|-&lt;br /&gt;
|0x04&lt;br /&gt;
|Sampling rate divisor.  Sample rate is the base clock divided by N+1, where N is the value in this register.&lt;br /&gt;
|-&lt;br /&gt;
|0x0a&lt;br /&gt;
|Sampling base clock select: 0 = 100MHz, 1 = 160MHz&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Marcus Comstedt</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=Saleae_Logic16/Firmware&amp;diff=6844</id>
		<title>Saleae Logic16/Firmware</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=Saleae_Logic16/Firmware&amp;diff=6844"/>
		<updated>2013-07-29T10:35:40Z</updated>

		<summary type="html">&lt;p&gt;Marcus Comstedt: /* XDATA variables */ Added dumps of the waveform descriptors&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The following information is related to the vendor firmware included with the&lt;br /&gt;
version 1.1.15 of the vendor application &amp;quot;Logic&amp;quot;.&lt;br /&gt;
== Interrupt handlers ==&lt;br /&gt;
The following interrupt handlers are installed.  If the address is absent, it means the handler just returns (RETI) without performing any action.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|RESET&lt;br /&gt;
|0x0000&lt;br /&gt;
|-&lt;br /&gt;
|TF2&lt;br /&gt;
|0x0e65&lt;br /&gt;
|-&lt;br /&gt;
|RESUME&lt;br /&gt;
|0x002e&lt;br /&gt;
|-&lt;br /&gt;
|SUDAV&lt;br /&gt;
|0x0ae8&lt;br /&gt;
|-&lt;br /&gt;
|SOF&lt;br /&gt;
|0x13d2&lt;br /&gt;
|-&lt;br /&gt;
|SUTOK&lt;br /&gt;
|0x13bf&lt;br /&gt;
|-&lt;br /&gt;
|SUSPEND&lt;br /&gt;
|0x13aa&lt;br /&gt;
|-&lt;br /&gt;
|USB_RESET&lt;br /&gt;
|0x130b&lt;br /&gt;
|-&lt;br /&gt;
|HISPEED&lt;br /&gt;
|0x12df&lt;br /&gt;
|-&lt;br /&gt;
|EP0ACK&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP0_IN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP0_OUT&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP1_IN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP1_OUT&lt;br /&gt;
|0x115d&lt;br /&gt;
|-&lt;br /&gt;
|EP2&lt;br /&gt;
|0x11a2&lt;br /&gt;
|-&lt;br /&gt;
|EP4&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|IBN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP0PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP1PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|ERRLIMIT&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2ISOERR&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4ISOERRF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6ISOERR&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8ISOERRF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2FF&lt;br /&gt;
|0x11e7&lt;br /&gt;
|-&lt;br /&gt;
|EP4FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|GPIFDONE&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|GPIFWF&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Endpoint 1 OUT (EP1_OUT) handler ===&lt;br /&gt;
&lt;br /&gt;
After decrypting the OUT packet, processing of the packet proceeds depending on the first byte of the packet, which selects the operation.  After the operation, any resulting IN packet will be encrypted before submitting it to the host.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Byte&lt;br /&gt;
! Handler&lt;br /&gt;
! Operation&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 0x14f&lt;br /&gt;
| Configure endpoints for quad-buffered bulk FIFO operation, and trigger a GPIF read on EP2.&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 0x157&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| 0x15f&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| 0x1b3&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7a&lt;br /&gt;
| 0x309&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7b&lt;br /&gt;
| 0x346&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7c&lt;br /&gt;
| 0x282&lt;br /&gt;
| Re-renumerate; return control to the builtin bootloader.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7d&lt;br /&gt;
| 0x2aa&lt;br /&gt;
| Abort the GPIF.  The second byte of the packet is returned complemented in an IN transfer, as acknowledgement.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7e&lt;br /&gt;
| 0x2cf&lt;br /&gt;
| Configure the GPIF, and prepare the FPGA for bitstream upload by pulsing PROG_B and then waiting for INIT_B.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7f&lt;br /&gt;
| 0x2e4&lt;br /&gt;
| Transmit N (1-62) bytes of bitstream on the FPGA DIN pin, clocked by CCLK.  The second byte of the packet encodes N.&lt;br /&gt;
|-&lt;br /&gt;
| 0x80&lt;br /&gt;
| 0x205&lt;br /&gt;
| Transmit N (1-31) 16-bit words to the FPGA.  The second byte of the packet encodes N. Data is sent on PA6, MSB first, with rising edges of PA5 to clock the bits out. During each word transfer, PA4 is held low.  The most significant bit (b15) of each word must be 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x81&lt;br /&gt;
| 0x23b&lt;br /&gt;
| Perform N (1-31) write-read transactions to the FPGA.  The second byte of the packet encodes N.  Each transaction consists of 8 bits (from the out packet) being transmitted on PA6, like for the 0x80 operation above, and then 8 bits being received on PA7.  N bytes will be available for an IN transfer afterwards.  The most significant bit (b7) of each byte to send must be 0, but is actually transmitted as a 1 (to indicate read operation).  PA7 is polled immediately after the falling edge of PA5.  PA4 is held low during each write-read transaction.&lt;br /&gt;
|-&lt;br /&gt;
| 0x82&lt;br /&gt;
| 0x3a3&lt;br /&gt;
| Read the REVID register.  16 bits of REVID data will be available for an IN transfer.&lt;br /&gt;
|-&lt;br /&gt;
| others&lt;br /&gt;
| 0x3c7&lt;br /&gt;
| Do nothing&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Command 0x7e waveform ====&lt;br /&gt;
[[File:Logic16 FW Command 0x7e Waveform.svg]]&lt;br /&gt;
==== Command 0x7f waveform ====&lt;br /&gt;
[[File:Logic16 FW Command 0x7f Waveform.svg]]&lt;br /&gt;
==== Command 0x80 waveform ====&lt;br /&gt;
[[File:Logic16 FW Command 0x80 Waveform.svg]]&lt;br /&gt;
==== Command 0x81 waveform ====&lt;br /&gt;
[[File:Logic16 FW Command 0x81 Waveform.svg]]&lt;br /&gt;
&lt;br /&gt;
== XDATA variables ==&lt;br /&gt;
The following variables are stored in the 8K &amp;quot;external&amp;quot; code/data memory, after the firmware code.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!rowspan=&amp;quot;2&amp;quot;|Address&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Init data in FW&lt;br /&gt;
!rowspan=&amp;quot;2&amp;quot;|Contents&lt;br /&gt;
|-&lt;br /&gt;
!Address&lt;br /&gt;
!Value&lt;br /&gt;
|-&lt;br /&gt;
|0x1f00-0x1f7f&lt;br /&gt;
|0x8d6-0x955&lt;br /&gt;
|&lt;br /&gt;
|WAVEDATA&lt;br /&gt;
|-&lt;br /&gt;
|0x1f80&lt;br /&gt;
|0x981&lt;br /&gt;
|0xe0&lt;br /&gt;
|GPIFREADYCFG&lt;br /&gt;
|-&lt;br /&gt;
|0x1f81&lt;br /&gt;
|0x982&lt;br /&gt;
|0x10&lt;br /&gt;
|GPIFCTLCFG&lt;br /&gt;
|-&lt;br /&gt;
|0x1f82&lt;br /&gt;
|0x983&lt;br /&gt;
|0x00&lt;br /&gt;
|GPIFIDLECS&lt;br /&gt;
|-&lt;br /&gt;
|0x1f83&lt;br /&gt;
|0x984&lt;br /&gt;
|0x05&lt;br /&gt;
|GPIFIDLECTL&lt;br /&gt;
|-&lt;br /&gt;
|0x1f84&lt;br /&gt;
|0x985&lt;br /&gt;
|0xee&lt;br /&gt;
|?&lt;br /&gt;
|-&lt;br /&gt;
|0x1f85&lt;br /&gt;
|0x986&lt;br /&gt;
|0x50&lt;br /&gt;
|GPIFWFSELECT&lt;br /&gt;
|-&lt;br /&gt;
|0x1f86&lt;br /&gt;
|0x987&lt;br /&gt;
|0x00&lt;br /&gt;
|GPIFREADYSTAT&lt;br /&gt;
|-&lt;br /&gt;
|0x1f87-0x1faa&lt;br /&gt;
|0x95a-0x97d&lt;br /&gt;
|&lt;br /&gt;
|?&lt;br /&gt;
|-&lt;br /&gt;
|0x1fab-0x1fea&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|?&lt;br /&gt;
|}&lt;br /&gt;
=== WAVEDATA ===&lt;br /&gt;
The following data is loaded into WAVEDATA on bootup, and whenever operation 0x7e is performed:&lt;br /&gt;
==== Waveform descriptor 0 ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!State&lt;br /&gt;
!Length/Branch&lt;br /&gt;
!Opcode&lt;br /&gt;
!Logic&lt;br /&gt;
!Output&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|0x81&lt;br /&gt;
|0xB8  &lt;br /&gt;
|0x01  &lt;br /&gt;
|0x01  &lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|0x01  &lt;br /&gt;
|0x01  &lt;br /&gt;
|0x01  &lt;br /&gt;
|0x07  &lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|0x01  &lt;br /&gt;
|0x07  &lt;br /&gt;
|0x02  &lt;br /&gt;
|0x02  &lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|0x02  &lt;br /&gt;
|0x02  &lt;br /&gt;
|0x02  &lt;br /&gt;
|0x00  &lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|0x05  &lt;br /&gt;
|0x04  &lt;br /&gt;
|0x04  &lt;br /&gt;
|0x04  &lt;br /&gt;
|-&lt;br /&gt;
|5&lt;br /&gt;
|0x04  &lt;br /&gt;
|0x04  &lt;br /&gt;
|0x04  &lt;br /&gt;
|0x05  &lt;br /&gt;
|-&lt;br /&gt;
|6&lt;br /&gt;
|0x70&lt;br /&gt;
|0x2D&lt;br /&gt;
|0x00  &lt;br /&gt;
|0x00  &lt;br /&gt;
|-&lt;br /&gt;
|7&lt;br /&gt;
|0x00  &lt;br /&gt;
|0x00  &lt;br /&gt;
|0x00  &lt;br /&gt;
|0x3F&lt;br /&gt;
|}&lt;br /&gt;
==== Waveform descriptor 1-3 ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!State&lt;br /&gt;
!Length/Branch&lt;br /&gt;
!Opcode&lt;br /&gt;
!Logic&lt;br /&gt;
!Output&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|0x01&lt;br /&gt;
|0x01&lt;br /&gt;
|0x01&lt;br /&gt;
|0x01&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|0x01&lt;br /&gt;
|0x01&lt;br /&gt;
|0x01&lt;br /&gt;
|0x07&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|0x00&lt;br /&gt;
|0x00&lt;br /&gt;
|0x00&lt;br /&gt;
|0x00&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|0x00&lt;br /&gt;
|0x00&lt;br /&gt;
|0x00&lt;br /&gt;
|0x00&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|0x05&lt;br /&gt;
|0x05&lt;br /&gt;
|0x05&lt;br /&gt;
|0x05&lt;br /&gt;
|-&lt;br /&gt;
|5&lt;br /&gt;
|0x05&lt;br /&gt;
|0x05&lt;br /&gt;
|0x05&lt;br /&gt;
|0x05&lt;br /&gt;
|-&lt;br /&gt;
|6&lt;br /&gt;
|0x00&lt;br /&gt;
|0x00&lt;br /&gt;
|0x00&lt;br /&gt;
|0x00&lt;br /&gt;
|-&lt;br /&gt;
|7&lt;br /&gt;
|0x00&lt;br /&gt;
|0x00&lt;br /&gt;
|0x00&lt;br /&gt;
|0x3F &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== FPGA variables ==&lt;br /&gt;
The following variables can be read and written by the host using operations 0x81 and 0x80:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Address&lt;br /&gt;
! Contents&lt;br /&gt;
|-&lt;br /&gt;
|0x02&lt;br /&gt;
|Channel select low.  Each 1 bit in this byte enables one of the channels 0-7 for acquisition.&lt;br /&gt;
|-&lt;br /&gt;
|0x03&lt;br /&gt;
|Channel select high.  Each 1 bit in this byte enables one of the channels 8-15 for acquisition.&lt;br /&gt;
|-&lt;br /&gt;
|0x04&lt;br /&gt;
|Sampling rate divisor.  Sample rate is the base clock divided by N+1, where N is the value in this register.&lt;br /&gt;
|-&lt;br /&gt;
|0x0a&lt;br /&gt;
|Sampling base clock select: 0 = 100MHz, 1 = 160MHz&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Marcus Comstedt</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=Saleae_Logic16/Firmware&amp;diff=6838</id>
		<title>Saleae Logic16/Firmware</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=Saleae_Logic16/Firmware&amp;diff=6838"/>
		<updated>2013-07-28T21:58:20Z</updated>

		<summary type="html">&lt;p&gt;Marcus Comstedt: Added section on XDATA variables&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The following information is related to the vendor firmware included with the&lt;br /&gt;
version 1.1.15 of the vendor application &amp;quot;Logic&amp;quot;.&lt;br /&gt;
== Interrupt handlers ==&lt;br /&gt;
The following interrupt handlers are installed.  If the address is absent, it means the handler just returns (RETI) without performing any action.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|RESET&lt;br /&gt;
|0x0000&lt;br /&gt;
|-&lt;br /&gt;
|TF2&lt;br /&gt;
|0x0e65&lt;br /&gt;
|-&lt;br /&gt;
|RESUME&lt;br /&gt;
|0x002e&lt;br /&gt;
|-&lt;br /&gt;
|SUDAV&lt;br /&gt;
|0x0ae8&lt;br /&gt;
|-&lt;br /&gt;
|SOF&lt;br /&gt;
|0x13d2&lt;br /&gt;
|-&lt;br /&gt;
|SUTOK&lt;br /&gt;
|0x13bf&lt;br /&gt;
|-&lt;br /&gt;
|SUSPEND&lt;br /&gt;
|0x13aa&lt;br /&gt;
|-&lt;br /&gt;
|USB_RESET&lt;br /&gt;
|0x130b&lt;br /&gt;
|-&lt;br /&gt;
|HISPEED&lt;br /&gt;
|0x12df&lt;br /&gt;
|-&lt;br /&gt;
|EP0ACK&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP0_IN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP0_OUT&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP1_IN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP1_OUT&lt;br /&gt;
|0x115d&lt;br /&gt;
|-&lt;br /&gt;
|EP2&lt;br /&gt;
|0x11a2&lt;br /&gt;
|-&lt;br /&gt;
|EP4&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|IBN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP0PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP1PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|ERRLIMIT&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2ISOERR&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4ISOERRF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6ISOERR&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8ISOERRF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2FF&lt;br /&gt;
|0x11e7&lt;br /&gt;
|-&lt;br /&gt;
|EP4FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|GPIFDONE&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|GPIFWF&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Endpoint 1 OUT (EP1_OUT) handler ===&lt;br /&gt;
&lt;br /&gt;
After decrypting the OUT packet, processing of the packet proceeds depending on the first byte of the packet, which selects the operation.  After the operation, any resulting IN packet will be encrypted before submitting it to the host.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Byte&lt;br /&gt;
! Handler&lt;br /&gt;
! Operation&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 0x14f&lt;br /&gt;
| Configure endpoints for quad-buffered bulk FIFO operation, and trigger a GPIF read on EP2.&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 0x157&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| 0x15f&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| 0x1b3&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7a&lt;br /&gt;
| 0x309&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7b&lt;br /&gt;
| 0x346&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7c&lt;br /&gt;
| 0x282&lt;br /&gt;
| Re-renumerate; return control to the builtin bootloader.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7d&lt;br /&gt;
| 0x2aa&lt;br /&gt;
| Abort the GPIF.  The second byte of the packet is returned complemented in an IN transfer, as acknowledgement.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7e&lt;br /&gt;
| 0x2cf&lt;br /&gt;
| Configure the GPIF, and prepare the FPGA for bitstream upload by pulsing PROG_B and then waiting for INIT_B.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7f&lt;br /&gt;
| 0x2e4&lt;br /&gt;
| Transmit N (1-62) bytes of bitstream on the FPGA DIN pin, clocked by CCLK.  The second byte of the packet encodes N.&lt;br /&gt;
|-&lt;br /&gt;
| 0x80&lt;br /&gt;
| 0x205&lt;br /&gt;
| Transmit N (1-31) 16-bit words to the FPGA.  The second byte of the packet encodes N. Data is sent on PA6, MSB first, with rising edges of PA5 to clock the bits out. During each word transfer, PA4 is held low.  The most significant bit (b15) of each word must be 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x81&lt;br /&gt;
| 0x23b&lt;br /&gt;
| Perform N (1-31) write-read transactions to the FPGA.  The second byte of the packet encodes N.  Each transaction consists of 8 bits (from the out packet) being transmitted on PA6, like for the 0x80 operation above, and then 8 bits being received on PA7.  N bytes will be available for an IN transfer afterwards.  The most significant bit (b7) of each byte to send must be 0, but is actually transmitted as a 1 (to indicate read operation).  PA7 is polled immediately after the falling edge of PA5.  PA4 is held low during each write-read transaction.&lt;br /&gt;
|-&lt;br /&gt;
| 0x82&lt;br /&gt;
| 0x3a3&lt;br /&gt;
| Read the REVID register.  16 bits of REVID data will be available for an IN transfer.&lt;br /&gt;
|-&lt;br /&gt;
| others&lt;br /&gt;
| 0x3c7&lt;br /&gt;
| Do nothing&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Command 0x7e waveform ====&lt;br /&gt;
[[File:Logic16 FW Command 0x7e Waveform.svg]]&lt;br /&gt;
==== Command 0x7f waveform ====&lt;br /&gt;
[[File:Logic16 FW Command 0x7f Waveform.svg]]&lt;br /&gt;
==== Command 0x80 waveform ====&lt;br /&gt;
[[File:Logic16 FW Command 0x80 Waveform.svg]]&lt;br /&gt;
==== Command 0x81 waveform ====&lt;br /&gt;
[[File:Logic16 FW Command 0x81 Waveform.svg]]&lt;br /&gt;
&lt;br /&gt;
== XDATA variables ==&lt;br /&gt;
The following variables are stored in the 8K &amp;quot;external&amp;quot; code/data memory, after the firmware code.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!rowspan=&amp;quot;2&amp;quot;|Address&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Init data in FW&lt;br /&gt;
!rowspan=&amp;quot;2&amp;quot;|Contents&lt;br /&gt;
|-&lt;br /&gt;
!Address&lt;br /&gt;
!Value&lt;br /&gt;
|-&lt;br /&gt;
|0x1f00-0x1f7f&lt;br /&gt;
|0x8d6-0x955&lt;br /&gt;
|&lt;br /&gt;
|WAVEDATA&lt;br /&gt;
|-&lt;br /&gt;
|0x1f80&lt;br /&gt;
|0x981&lt;br /&gt;
|0xe0&lt;br /&gt;
|GPIFREADYCFG&lt;br /&gt;
|-&lt;br /&gt;
|0x1f81&lt;br /&gt;
|0x982&lt;br /&gt;
|0x10&lt;br /&gt;
|GPIFCTLCFG&lt;br /&gt;
|-&lt;br /&gt;
|0x1f82&lt;br /&gt;
|0x983&lt;br /&gt;
|0x00&lt;br /&gt;
|GPIFIDLECS&lt;br /&gt;
|-&lt;br /&gt;
|0x1f83&lt;br /&gt;
|0x984&lt;br /&gt;
|0x05&lt;br /&gt;
|GPIFIDLECTL&lt;br /&gt;
|-&lt;br /&gt;
|0x1f84&lt;br /&gt;
|0x985&lt;br /&gt;
|0xee&lt;br /&gt;
|?&lt;br /&gt;
|-&lt;br /&gt;
|0x1f85&lt;br /&gt;
|0x986&lt;br /&gt;
|0x50&lt;br /&gt;
|GPIFWFSELECT&lt;br /&gt;
|-&lt;br /&gt;
|0x1f86&lt;br /&gt;
|0x987&lt;br /&gt;
|0x00&lt;br /&gt;
|GPIFREADYSTAT&lt;br /&gt;
|-&lt;br /&gt;
|0x1f87-0x1faa&lt;br /&gt;
|0x95a-0x97d&lt;br /&gt;
|&lt;br /&gt;
|?&lt;br /&gt;
|-&lt;br /&gt;
|0x1fab-0x1fea&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== FPGA variables ==&lt;br /&gt;
The following variables can be read and written by the host using operations 0x81 and 0x80:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Address&lt;br /&gt;
! Contents&lt;br /&gt;
|-&lt;br /&gt;
|0x02&lt;br /&gt;
|Channel select low.  Each 1 bit in this byte enables one of the channels 0-7 for acquisition.&lt;br /&gt;
|-&lt;br /&gt;
|0x03&lt;br /&gt;
|Channel select high.  Each 1 bit in this byte enables one of the channels 8-15 for acquisition.&lt;br /&gt;
|-&lt;br /&gt;
|0x04&lt;br /&gt;
|Sampling rate divisor.  Sample rate is the base clock divided by N+1, where N is the value in this register.&lt;br /&gt;
|-&lt;br /&gt;
|0x0a&lt;br /&gt;
|Sampling base clock select: 0 = 100MHz, 1 = 160MHz&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Marcus Comstedt</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=File:Logic16_FW_Command_0x7e_Waveform.svg&amp;diff=6816</id>
		<title>File:Logic16 FW Command 0x7e Waveform.svg</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=File:Logic16_FW_Command_0x7e_Waveform.svg&amp;diff=6816"/>
		<updated>2013-07-26T18:00:40Z</updated>

		<summary type="html">&lt;p&gt;Marcus Comstedt: Marcus Comstedt uploaded a new version of &amp;amp;quot;File:Logic16 FW Command 0x7e Waveform.svg&amp;amp;quot;: Hand tweaked the placement of the arrow heads, which got munged in the export from WaveDrom...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Licensing ==&lt;br /&gt;
{{PD}}&lt;/div&gt;</summary>
		<author><name>Marcus Comstedt</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=Saleae_Logic16/Firmware&amp;diff=6815</id>
		<title>Saleae Logic16/Firmware</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=Saleae_Logic16/Firmware&amp;diff=6815"/>
		<updated>2013-07-26T17:52:06Z</updated>

		<summary type="html">&lt;p&gt;Marcus Comstedt: /* Endpoint 1 OUT (EP1_OUT) handler */ Added waveforms for command 0x7e and 0x7f&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The following information is related to the vendor firmware included with the&lt;br /&gt;
version 1.1.15 of the vendor application &amp;quot;Logic&amp;quot;.&lt;br /&gt;
== Interrupt handlers ==&lt;br /&gt;
The following interrupt handlers are installed.  If the address is absent, it means the handler just returns (RETI) without performing any action.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|RESET&lt;br /&gt;
|0x0000&lt;br /&gt;
|-&lt;br /&gt;
|TF2&lt;br /&gt;
|0x0e65&lt;br /&gt;
|-&lt;br /&gt;
|RESUME&lt;br /&gt;
|0x002e&lt;br /&gt;
|-&lt;br /&gt;
|SUDAV&lt;br /&gt;
|0x0ae8&lt;br /&gt;
|-&lt;br /&gt;
|SOF&lt;br /&gt;
|0x13d2&lt;br /&gt;
|-&lt;br /&gt;
|SUTOK&lt;br /&gt;
|0x13bf&lt;br /&gt;
|-&lt;br /&gt;
|SUSPEND&lt;br /&gt;
|0x13aa&lt;br /&gt;
|-&lt;br /&gt;
|USB_RESET&lt;br /&gt;
|0x130b&lt;br /&gt;
|-&lt;br /&gt;
|HISPEED&lt;br /&gt;
|0x12df&lt;br /&gt;
|-&lt;br /&gt;
|EP0ACK&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP0_IN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP0_OUT&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP1_IN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP1_OUT&lt;br /&gt;
|0x115d&lt;br /&gt;
|-&lt;br /&gt;
|EP2&lt;br /&gt;
|0x11a2&lt;br /&gt;
|-&lt;br /&gt;
|EP4&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|IBN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP0PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP1PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|ERRLIMIT&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2ISOERR&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4ISOERRF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6ISOERR&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8ISOERRF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2FF&lt;br /&gt;
|0x11e7&lt;br /&gt;
|-&lt;br /&gt;
|EP4FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|GPIFDONE&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|GPIFWF&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Endpoint 1 OUT (EP1_OUT) handler ===&lt;br /&gt;
&lt;br /&gt;
After decrypting the OUT packet, processing of the packet proceeds depending on the first byte of the packet, which selects the operation.  After the operation, any resulting IN packet will be encrypted before submitting it to the host.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Byte&lt;br /&gt;
! Handler&lt;br /&gt;
! Operation&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 0x14f&lt;br /&gt;
| Configure endpoints for quad-buffered bulk FIFO operation, and trigger a GPIF read on EP2.&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 0x157&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| 0x15f&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| 0x1b3&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7a&lt;br /&gt;
| 0x309&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7b&lt;br /&gt;
| 0x346&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7c&lt;br /&gt;
| 0x282&lt;br /&gt;
| Re-renumerate; return control to the builtin bootloader.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7d&lt;br /&gt;
| 0x2aa&lt;br /&gt;
| Abort the GPIF.  The second byte of the packet is returned complemented in an IN transfer, as acknowledgement.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7e&lt;br /&gt;
| 0x2cf&lt;br /&gt;
| Configure the GPIF, and prepare the FPGA for bitstream upload by pulsing PROG_B and then waiting for INIT_B.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7f&lt;br /&gt;
| 0x2e4&lt;br /&gt;
| Transmit N (1-62) bytes of bitstream on the FPGA DIN pin, clocked by CCLK.  The second byte of the packet encodes N.&lt;br /&gt;
|-&lt;br /&gt;
| 0x80&lt;br /&gt;
| 0x205&lt;br /&gt;
| Transmit N (1-31) 16-bit words to the FPGA.  The second byte of the packet encodes N. Data is sent on PA6, MSB first, with rising edges of PA5 to clock the bits out. During each word transfer, PA4 is held low.  The most significant bit (b15) of each word must be 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x81&lt;br /&gt;
| 0x23b&lt;br /&gt;
| Perform N (1-31) write-read transactions to the FPGA.  The second byte of the packet encodes N.  Each transaction consists of 8 bits (from the out packet) being transmitted on PA6, like for the 0x80 operation above, and then 8 bits being received on PA7.  N bytes will be available for an IN transfer afterwards.  The most significant bit (b7) of each byte to send must be 0, but is actually transmitted as a 1 (to indicate read operation).  PA7 is polled immediately after the falling edge of PA5.  PA4 is held low during each write-read transaction.&lt;br /&gt;
|-&lt;br /&gt;
| 0x82&lt;br /&gt;
| 0x3a3&lt;br /&gt;
| Read the REVID register.  16 bits of REVID data will be available for an IN transfer.&lt;br /&gt;
|-&lt;br /&gt;
| others&lt;br /&gt;
| 0x3c7&lt;br /&gt;
| Do nothing&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Command 0x7e waveform ====&lt;br /&gt;
[[File:Logic16 FW Command 0x7e Waveform.svg]]&lt;br /&gt;
==== Command 0x7f waveform ====&lt;br /&gt;
[[File:Logic16 FW Command 0x7f Waveform.svg]]&lt;br /&gt;
==== Command 0x80 waveform ====&lt;br /&gt;
[[File:Logic16 FW Command 0x80 Waveform.svg]]&lt;br /&gt;
==== Command 0x81 waveform ====&lt;br /&gt;
[[File:Logic16 FW Command 0x81 Waveform.svg]]&lt;br /&gt;
&lt;br /&gt;
== FPGA variables ==&lt;br /&gt;
The following variables can be read and written by the host using operations 0x81 and 0x80:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Address&lt;br /&gt;
! Contents&lt;br /&gt;
|-&lt;br /&gt;
|0x02&lt;br /&gt;
|Channel select low.  Each 1 bit in this byte enables one of the channels 0-7 for acquisition.&lt;br /&gt;
|-&lt;br /&gt;
|0x03&lt;br /&gt;
|Channel select high.  Each 1 bit in this byte enables one of the channels 8-15 for acquisition.&lt;br /&gt;
|-&lt;br /&gt;
|0x04&lt;br /&gt;
|Sampling rate divisor.  Sample rate is the base clock divided by N+1, where N is the value in this register.&lt;br /&gt;
|-&lt;br /&gt;
|0x0a&lt;br /&gt;
|Sampling base clock select: 0 = 100MHz, 1 = 160MHz&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Marcus Comstedt</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=File:Logic16_FW_Command_0x7f_Waveform.svg&amp;diff=6814</id>
		<title>File:Logic16 FW Command 0x7f Waveform.svg</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=File:Logic16_FW_Command_0x7f_Waveform.svg&amp;diff=6814"/>
		<updated>2013-07-26T17:48:43Z</updated>

		<summary type="html">&lt;p&gt;Marcus Comstedt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Licensing ==&lt;br /&gt;
{{PD}}&lt;/div&gt;</summary>
		<author><name>Marcus Comstedt</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=File:Logic16_FW_Command_0x7e_Waveform.svg&amp;diff=6813</id>
		<title>File:Logic16 FW Command 0x7e Waveform.svg</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=File:Logic16_FW_Command_0x7e_Waveform.svg&amp;diff=6813"/>
		<updated>2013-07-26T17:47:47Z</updated>

		<summary type="html">&lt;p&gt;Marcus Comstedt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Licensing ==&lt;br /&gt;
{{PD}}&lt;/div&gt;</summary>
		<author><name>Marcus Comstedt</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=Saleae_Logic16/Firmware&amp;diff=6812</id>
		<title>Saleae Logic16/Firmware</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=Saleae_Logic16/Firmware&amp;diff=6812"/>
		<updated>2013-07-26T15:12:32Z</updated>

		<summary type="html">&lt;p&gt;Marcus Comstedt: Added a section on FPGA config variables&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The following information is related to the vendor firmware included with the&lt;br /&gt;
version 1.1.15 of the vendor application &amp;quot;Logic&amp;quot;.&lt;br /&gt;
== Interrupt handlers ==&lt;br /&gt;
The following interrupt handlers are installed.  If the address is absent, it means the handler just returns (RETI) without performing any action.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|RESET&lt;br /&gt;
|0x0000&lt;br /&gt;
|-&lt;br /&gt;
|TF2&lt;br /&gt;
|0x0e65&lt;br /&gt;
|-&lt;br /&gt;
|RESUME&lt;br /&gt;
|0x002e&lt;br /&gt;
|-&lt;br /&gt;
|SUDAV&lt;br /&gt;
|0x0ae8&lt;br /&gt;
|-&lt;br /&gt;
|SOF&lt;br /&gt;
|0x13d2&lt;br /&gt;
|-&lt;br /&gt;
|SUTOK&lt;br /&gt;
|0x13bf&lt;br /&gt;
|-&lt;br /&gt;
|SUSPEND&lt;br /&gt;
|0x13aa&lt;br /&gt;
|-&lt;br /&gt;
|USB_RESET&lt;br /&gt;
|0x130b&lt;br /&gt;
|-&lt;br /&gt;
|HISPEED&lt;br /&gt;
|0x12df&lt;br /&gt;
|-&lt;br /&gt;
|EP0ACK&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP0_IN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP0_OUT&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP1_IN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP1_OUT&lt;br /&gt;
|0x115d&lt;br /&gt;
|-&lt;br /&gt;
|EP2&lt;br /&gt;
|0x11a2&lt;br /&gt;
|-&lt;br /&gt;
|EP4&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|IBN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP0PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP1PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|ERRLIMIT&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2ISOERR&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4ISOERRF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6ISOERR&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8ISOERRF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2FF&lt;br /&gt;
|0x11e7&lt;br /&gt;
|-&lt;br /&gt;
|EP4FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|GPIFDONE&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|GPIFWF&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Endpoint 1 OUT (EP1_OUT) handler ===&lt;br /&gt;
&lt;br /&gt;
After decrypting the OUT packet, processing of the packet proceeds depending on the first byte of the packet, which selects the operation.  After the operation, any resulting IN packet will be encrypted before submitting it to the host.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Byte&lt;br /&gt;
! Handler&lt;br /&gt;
! Operation&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 0x14f&lt;br /&gt;
| Configure endpoints for quad-buffered bulk FIFO operation, and trigger a GPIF read on EP2.&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 0x157&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| 0x15f&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| 0x1b3&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7a&lt;br /&gt;
| 0x309&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7b&lt;br /&gt;
| 0x346&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7c&lt;br /&gt;
| 0x282&lt;br /&gt;
| Re-renumerate; return control to the builtin bootloader.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7d&lt;br /&gt;
| 0x2aa&lt;br /&gt;
| Abort the GPIF.  The second byte of the packet is returned complemented in an IN transfer, as acknowledgement.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7e&lt;br /&gt;
| 0x2cf&lt;br /&gt;
| Configure the GPIF, and prepare the FPGA for bitstream upload by pulsing PROG_B and then waiting for INIT_B.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7f&lt;br /&gt;
| 0x2e4&lt;br /&gt;
| Transmit N (1-62) bytes of bitstream on the FPGA DIN pin, clocked by CCLK.  The second byte of the packet encodes N.&lt;br /&gt;
|-&lt;br /&gt;
| 0x80&lt;br /&gt;
| 0x205&lt;br /&gt;
| Transmit N (1-31) 16-bit words to the FPGA.  The second byte of the packet encodes N. Data is sent on PA6, MSB first, with rising edges of PA5 to clock the bits out. During each word transfer, PA4 is held low.  The most significant bit (b15) of each word must be 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x81&lt;br /&gt;
| 0x23b&lt;br /&gt;
| Perform N (1-31) write-read transactions to the FPGA.  The second byte of the packet encodes N.  Each transaction consists of 8 bits (from the out packet) being transmitted on PA6, like for the 0x80 operation above, and then 8 bits being received on PA7.  N bytes will be available for an IN transfer afterwards.  The most significant bit (b7) of each byte to send must be 0, but is actually transmitted as a 1 (to indicate read operation).  PA7 is polled immediately after the falling edge of PA5.  PA4 is held low during each write-read transaction.&lt;br /&gt;
|-&lt;br /&gt;
| 0x82&lt;br /&gt;
| 0x3a3&lt;br /&gt;
| Read the REVID register.  16 bits of REVID data will be available for an IN transfer.&lt;br /&gt;
|-&lt;br /&gt;
| others&lt;br /&gt;
| 0x3c7&lt;br /&gt;
| Do nothing&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Command 0x80 waveform ====&lt;br /&gt;
[[File:Logic16 FW Command 0x80 Waveform.svg]]&lt;br /&gt;
==== Command 0x81 waveform ====&lt;br /&gt;
[[File:Logic16 FW Command 0x81 Waveform.svg]]&lt;br /&gt;
&lt;br /&gt;
== FPGA variables ==&lt;br /&gt;
The following variables can be read and written by the host using operations 0x81 and 0x80:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Address&lt;br /&gt;
! Contents&lt;br /&gt;
|-&lt;br /&gt;
|0x02&lt;br /&gt;
|Channel select low.  Each 1 bit in this byte enables one of the channels 0-7 for acquisition.&lt;br /&gt;
|-&lt;br /&gt;
|0x03&lt;br /&gt;
|Channel select high.  Each 1 bit in this byte enables one of the channels 8-15 for acquisition.&lt;br /&gt;
|-&lt;br /&gt;
|0x04&lt;br /&gt;
|Sampling rate divisor.  Sample rate is the base clock divided by N+1, where N is the value in this register.&lt;br /&gt;
|-&lt;br /&gt;
|0x0a&lt;br /&gt;
|Sampling base clock select: 0 = 100MHz, 1 = 160MHz&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Marcus Comstedt</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=Saleae_Logic16&amp;diff=6811</id>
		<title>Saleae Logic16</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=Saleae_Logic16&amp;diff=6811"/>
		<updated>2013-07-26T15:04:26Z</updated>

		<summary type="html">&lt;p&gt;Marcus Comstedt: /* Protocol */ Completed channel number and sampling frequency tables&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox logic analyzer&lt;br /&gt;
| image            = [[File:Saleae Logic16.jpg|180px]]&lt;br /&gt;
| name             = Saleae Logic16&lt;br /&gt;
| status           = planned&lt;br /&gt;
| source_code_dir  = &lt;br /&gt;
| channels         = 2/4/8/16&lt;br /&gt;
| samplerate       = 100/50/25/12.5MHz&lt;br /&gt;
| samplerate_state = &amp;amp;mdash;&lt;br /&gt;
| triggers         = none (SW-only)&lt;br /&gt;
| voltages         = -0.9V &amp;amp;mdash; 6V&lt;br /&gt;
| threshold        = configurable:&amp;lt;br /&amp;gt;for 1.8V to 3.6V systems: VIH=1.4V, VIL=0.7V&amp;lt;br /&amp;gt;for 5V systems: VIH=3.6V, VIL=1.4V&lt;br /&gt;
| memory           = none&lt;br /&gt;
| compression      = yes&lt;br /&gt;
| website          = [http://www.saleae.com/logic16/ saleae.com]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
The &amp;#039;&amp;#039;&amp;#039;Saleae Logic16&amp;#039;&amp;#039;&amp;#039; is a USB-based, 16-channel logic analyzer with 100/50/25/12.5MHz sampling rate (at 2/4/8/16 enabled channels). &lt;br /&gt;
&lt;br /&gt;
The case requires a &amp;#039;&amp;#039;&amp;#039;Torx T5&amp;#039;&amp;#039;&amp;#039; screwdriver to open.&lt;br /&gt;
&lt;br /&gt;
See [[Saleae Logic16/Info]] for more details (such as &amp;#039;&amp;#039;&amp;#039;lsusb -vvv&amp;#039;&amp;#039;&amp;#039; output) about the device.&lt;br /&gt;
&lt;br /&gt;
See [[Saleae Logic]] for the predecessor product of the Saleae Logic16. &lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;FPGA&amp;#039;&amp;#039;&amp;#039;: [http://www.xilinx.com/support/index.html/content/xilinx/en/supportNav/silicon_devices/fpga/spartan-3a.html Xilinx Spartan-3A XC3S200A], 200K gates ([http://www.xilinx.com/support/documentation/data_sheets/ds529.pdf datasheeet])&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;USB interface chip&amp;#039;&amp;#039;&amp;#039;: [http://www.cypress.com/?mpn=CY7C68013A-56PVXC Cypress CY7C68013A-56PVXC (FX2LP)] ([http://www.cypress.com/?docID=34060 datasheet])&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ultralow capacitance ESD protection&amp;#039;&amp;#039;&amp;#039;: 4x [http://www.st.com/web/catalog/sense_power/FM114/CL1137/SC1490/PF109008 ST DVIULC6-4SC6] ([http://www.st.com/st-web-ui/static/active/en/resource/technical/document/datasheet/CD00065974.pdf datasheet])&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;I2C EEPROM&amp;#039;&amp;#039;&amp;#039;: Unknown. Marking: &amp;quot;B2TH&amp;quot;.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;?&amp;#039;&amp;#039;&amp;#039;: 2x Unknown 5-pin IC. Markings: &amp;quot;189Z&amp;quot; and &amp;quot;189C&amp;quot;.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;?&amp;#039;&amp;#039;&amp;#039;: 2x Unknown 3-pin IC. Markings: &amp;quot;72Y7&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Photos ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Saleae Logic16.jpg|&amp;lt;small&amp;gt;Device, front&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Saleae Logic16 bottom.jpg|&amp;lt;small&amp;gt;Device, bottom&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Saleae Logic16 PCB top.jpg|&amp;lt;small&amp;gt;PCB, top&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Saleae Logic16 PCB bottom.jpg|&amp;lt;small&amp;gt;PCB, bottom&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Firmware ==&lt;br /&gt;
&lt;br /&gt;
The firmware for the FX2LP is embedded in the vendor application as a set of Intel HEX lines.  Each line is uploaded individually with a separate control transfer.  The firmware currently occupies the address range [0x0000-0x145d], but is uploaded out of order.  &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;TODO&amp;lt;/span&amp;gt;: Make a tool to extract the firmware from the application binary.&lt;br /&gt;
&lt;br /&gt;
See [[Saleae Logic16/Firmware]] for more details on the vendor firmware.&lt;br /&gt;
&lt;br /&gt;
== Protocol ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Sample format&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
The samples (as received via USB) for the enabled probes (3, 6, 9, or 16) are organized as follows:&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;&amp;lt;span style=&amp;quot;background-color: yellow&amp;quot;&amp;gt;0xLL 0xLL  0xMM 0xMM  0xNN 0xNN&amp;lt;/span&amp;gt;   &amp;lt;span style=&amp;quot;background-color: cyan&amp;quot;&amp;gt;0xPP 0xPP  0xQQ 0xQQ  0xRR 0xRR&amp;lt;/span&amp;gt; ...&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
In the above example, 3 probes are enabled. For each probe there are 2 bytes / 16 bits (e.g. 0xLL 0xLL for probe 0), then the next probe&amp;#039;s data is received (0xMM 0xMM for probe 1), then 0xNN 0xNN for probe 2. When 2 bytes have been received for all enabled probes, the process restarts with probe 0 again.&lt;br /&gt;
&lt;br /&gt;
The 16 bits of data per probe seem to contain the pin state of the respective probe (1: high, 0: low) at 16 different sampling points/times (which ones depends on the samplerate).&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Configuration&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
Endpoint 1 is used for configuration of the analyzer.  The transfers are &amp;quot;encrypted&amp;quot; using a simple series of additions and XORs.  Two kinds of transfers are used; a 3 byte out transfer starting with 0x81 followed by a 1 byte in transfer, and a 4 byte out transfer starting with 0x80.  It&amp;#039;s quite plausible that these provide raw read/write access to memory locations.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Channel number configuration&lt;br /&gt;
|-&lt;br /&gt;
|3 channels&lt;br /&gt;
|&amp;lt;tt&amp;gt;&amp;lt;span style=&amp;quot;background-color: yellow&amp;quot;&amp;gt;0x80 0x01 0x02 0x07&amp;lt;/span&amp;gt;   &amp;lt;span style=&amp;quot;background-color: cyan&amp;quot;&amp;gt;0x80 0x01 0x03 0x00&amp;lt;/span&amp;gt;&amp;lt;/tt&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
|6 channels&lt;br /&gt;
|&amp;lt;tt&amp;gt;&amp;lt;span style=&amp;quot;background-color: yellow&amp;quot;&amp;gt;0x80 0x01 0x02 0x3f&amp;lt;/span&amp;gt;   &amp;lt;span style=&amp;quot;background-color: cyan&amp;quot;&amp;gt;0x80 0x01 0x03 0x00&amp;lt;/span&amp;gt;&amp;lt;/tt&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
|9 channels&lt;br /&gt;
|&amp;lt;tt&amp;gt;&amp;lt;span style=&amp;quot;background-color: yellow&amp;quot;&amp;gt;0x80 0x01 0x02 0xff&amp;lt;/span&amp;gt;   &amp;lt;span style=&amp;quot;background-color: cyan&amp;quot;&amp;gt;0x80 0x01 0x03 0x01&amp;lt;/span&amp;gt;&amp;lt;/tt&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
|16 channels&lt;br /&gt;
|&amp;lt;tt&amp;gt;&amp;lt;span style=&amp;quot;background-color: yellow&amp;quot;&amp;gt;0x80 0x01 0x02 0xff&amp;lt;/span&amp;gt;   &amp;lt;span style=&amp;quot;background-color: cyan&amp;quot;&amp;gt;0x80 0x01 0x03 0xff&amp;lt;/span&amp;gt;&amp;lt;/tt&amp;gt; &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Sampling frequency&lt;br /&gt;
|-&lt;br /&gt;
|500 kHz&lt;br /&gt;
|&amp;lt;tt&amp;gt;&amp;lt;span style=&amp;quot;background-color: yellow&amp;quot;&amp;gt;0x80 0x01 0x0a 0x00&amp;lt;/span&amp;gt;   &amp;lt;span style=&amp;quot;background-color: cyan&amp;quot;&amp;gt;0x80 0x01 0x04 0xc7&amp;lt;/span&amp;gt;&amp;lt;/tt&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
|1 MHz&lt;br /&gt;
|&amp;lt;tt&amp;gt;&amp;lt;span style=&amp;quot;background-color: yellow&amp;quot;&amp;gt;0x80 0x01 0x0a 0x00&amp;lt;/span&amp;gt;   &amp;lt;span style=&amp;quot;background-color: cyan&amp;quot;&amp;gt;0x80 0x01 0x04 0x63&amp;lt;/span&amp;gt;&amp;lt;/tt&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
|2 MHz&lt;br /&gt;
|&amp;lt;tt&amp;gt;&amp;lt;span style=&amp;quot;background-color: yellow&amp;quot;&amp;gt;0x80 0x01 0x0a 0x00&amp;lt;/span&amp;gt;   &amp;lt;span style=&amp;quot;background-color: cyan&amp;quot;&amp;gt;0x80 0x01 0x04 0x31&amp;lt;/span&amp;gt;&amp;lt;/tt&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
|4 MHz&lt;br /&gt;
|&amp;lt;tt&amp;gt;&amp;lt;span style=&amp;quot;background-color: yellow&amp;quot;&amp;gt;0x80 0x01 0x0a 0x00&amp;lt;/span&amp;gt;   &amp;lt;span style=&amp;quot;background-color: cyan&amp;quot;&amp;gt;0x80 0x01 0x04 0x18&amp;lt;/span&amp;gt;&amp;lt;/tt&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
|5 MHz&lt;br /&gt;
|&amp;lt;tt&amp;gt;&amp;lt;span style=&amp;quot;background-color: yellow&amp;quot;&amp;gt;0x80 0x01 0x0a 0x00&amp;lt;/span&amp;gt;   &amp;lt;span style=&amp;quot;background-color: cyan&amp;quot;&amp;gt;0x80 0x01 0x04 0x13&amp;lt;/span&amp;gt;&amp;lt;/tt&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
|8 MHz&lt;br /&gt;
|&amp;lt;tt&amp;gt;&amp;lt;span style=&amp;quot;background-color: yellow&amp;quot;&amp;gt;0x80 0x01 0x0a 0x01&amp;lt;/span&amp;gt;   &amp;lt;span style=&amp;quot;background-color: cyan&amp;quot;&amp;gt;0x80 0x01 0x04 0x13&amp;lt;/span&amp;gt;&amp;lt;/tt&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
|10 MHz&lt;br /&gt;
|&amp;lt;tt&amp;gt;&amp;lt;span style=&amp;quot;background-color: yellow&amp;quot;&amp;gt;0x80 0x01 0x0a 0x00&amp;lt;/span&amp;gt;   &amp;lt;span style=&amp;quot;background-color: cyan&amp;quot;&amp;gt;0x80 0x01 0x04 0x09&amp;lt;/span&amp;gt;&amp;lt;/tt&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
|12.5 MHz&lt;br /&gt;
|&amp;lt;tt&amp;gt;&amp;lt;span style=&amp;quot;background-color: yellow&amp;quot;&amp;gt;0x80 0x01 0x0a 0x00&amp;lt;/span&amp;gt;   &amp;lt;span style=&amp;quot;background-color: cyan&amp;quot;&amp;gt;0x80 0x01 0x04 0x07&amp;lt;/span&amp;gt;&amp;lt;/tt&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
|16 MHz&lt;br /&gt;
|&amp;lt;tt&amp;gt;&amp;lt;span style=&amp;quot;background-color: yellow&amp;quot;&amp;gt;0x80 0x01 0x0a 0x01&amp;lt;/span&amp;gt;   &amp;lt;span style=&amp;quot;background-color: cyan&amp;quot;&amp;gt;0x80 0x01 0x04 0x09&amp;lt;/span&amp;gt;&amp;lt;/tt&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
|25 MHz&lt;br /&gt;
|&amp;lt;tt&amp;gt;&amp;lt;span style=&amp;quot;background-color: yellow&amp;quot;&amp;gt;0x80 0x01 0x0a 0x00&amp;lt;/span&amp;gt;   &amp;lt;span style=&amp;quot;background-color: cyan&amp;quot;&amp;gt;0x80 0x01 0x04 0x03&amp;lt;/span&amp;gt;&amp;lt;/tt&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
|32 MHz&lt;br /&gt;
|&amp;lt;tt&amp;gt;&amp;lt;span style=&amp;quot;background-color: yellow&amp;quot;&amp;gt;0x80 0x01 0x0a 0x01&amp;lt;/span&amp;gt;   &amp;lt;span style=&amp;quot;background-color: cyan&amp;quot;&amp;gt;0x80 0x01 0x04 0x04&amp;lt;/span&amp;gt;&amp;lt;/tt&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
|40 MHz&lt;br /&gt;
|&amp;lt;tt&amp;gt;&amp;lt;span style=&amp;quot;background-color: yellow&amp;quot;&amp;gt;0x80 0x01 0x0a 0x01&amp;lt;/span&amp;gt;   &amp;lt;span style=&amp;quot;background-color: cyan&amp;quot;&amp;gt;0x80 0x01 0x04 0x03&amp;lt;/span&amp;gt;&amp;lt;/tt&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
|50 MHz&lt;br /&gt;
|&amp;lt;tt&amp;gt;&amp;lt;span style=&amp;quot;background-color: yellow&amp;quot;&amp;gt;0x80 0x01 0x0a 0x00&amp;lt;/span&amp;gt;   &amp;lt;span style=&amp;quot;background-color: cyan&amp;quot;&amp;gt;0x80 0x01 0x04 0x01&amp;lt;/span&amp;gt;&amp;lt;/tt&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
|80 MHz&lt;br /&gt;
|&amp;lt;tt&amp;gt;&amp;lt;span style=&amp;quot;background-color: yellow&amp;quot;&amp;gt;0x80 0x01 0x0a 0x01&amp;lt;/span&amp;gt;   &amp;lt;span style=&amp;quot;background-color: cyan&amp;quot;&amp;gt;0x80 0x01 0x04 0x01&amp;lt;/span&amp;gt;&amp;lt;/tt&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
|100 MHz&lt;br /&gt;
|&amp;lt;tt&amp;gt;&amp;lt;span style=&amp;quot;background-color: yellow&amp;quot;&amp;gt;0x80 0x01 0x0a 0x00&amp;lt;/span&amp;gt;   &amp;lt;span style=&amp;quot;background-color: cyan&amp;quot;&amp;gt;0x80 0x01 0x04 0x00&amp;lt;/span&amp;gt;&amp;lt;/tt&amp;gt; &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Resources ==&lt;br /&gt;
&lt;br /&gt;
* [http://downloads.saleae.com/Logic+Guide.pdf Manual]&lt;br /&gt;
* [http://www.saleae.com/downloads Vendor software]&lt;br /&gt;
* [http://community.saleae.com/ SDKs]&lt;br /&gt;
&lt;br /&gt;
[[Category:Device]]&lt;br /&gt;
[[Category:Logic analyzer]]&lt;br /&gt;
[[Category:Planned]]&lt;/div&gt;</summary>
		<author><name>Marcus Comstedt</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=Saleae_Logic16/Firmware&amp;diff=6810</id>
		<title>Saleae Logic16/Firmware</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=Saleae_Logic16/Firmware&amp;diff=6810"/>
		<updated>2013-07-26T13:29:12Z</updated>

		<summary type="html">&lt;p&gt;Marcus Comstedt: /* Endpoint 1 OUT (EP1_OUT) handler */ Explain operation 1.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The following information is related to the vendor firmware included with the&lt;br /&gt;
version 1.1.15 of the vendor application &amp;quot;Logic&amp;quot;.&lt;br /&gt;
== Interrupt handlers ==&lt;br /&gt;
The following interrupt handlers are installed.  If the address is absent, it means the handler just returns (RETI) without performing any action.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|RESET&lt;br /&gt;
|0x0000&lt;br /&gt;
|-&lt;br /&gt;
|TF2&lt;br /&gt;
|0x0e65&lt;br /&gt;
|-&lt;br /&gt;
|RESUME&lt;br /&gt;
|0x002e&lt;br /&gt;
|-&lt;br /&gt;
|SUDAV&lt;br /&gt;
|0x0ae8&lt;br /&gt;
|-&lt;br /&gt;
|SOF&lt;br /&gt;
|0x13d2&lt;br /&gt;
|-&lt;br /&gt;
|SUTOK&lt;br /&gt;
|0x13bf&lt;br /&gt;
|-&lt;br /&gt;
|SUSPEND&lt;br /&gt;
|0x13aa&lt;br /&gt;
|-&lt;br /&gt;
|USB_RESET&lt;br /&gt;
|0x130b&lt;br /&gt;
|-&lt;br /&gt;
|HISPEED&lt;br /&gt;
|0x12df&lt;br /&gt;
|-&lt;br /&gt;
|EP0ACK&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP0_IN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP0_OUT&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP1_IN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP1_OUT&lt;br /&gt;
|0x115d&lt;br /&gt;
|-&lt;br /&gt;
|EP2&lt;br /&gt;
|0x11a2&lt;br /&gt;
|-&lt;br /&gt;
|EP4&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|IBN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP0PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP1PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|ERRLIMIT&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2ISOERR&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4ISOERRF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6ISOERR&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8ISOERRF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2FF&lt;br /&gt;
|0x11e7&lt;br /&gt;
|-&lt;br /&gt;
|EP4FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|GPIFDONE&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|GPIFWF&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Endpoint 1 OUT (EP1_OUT) handler ===&lt;br /&gt;
&lt;br /&gt;
After decrypting the OUT packet, processing of the packet proceeds depending on the first byte of the packet, which selects the operation.  After the operation, any resulting IN packet will be encrypted before submitting it to the host.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Byte&lt;br /&gt;
! Handler&lt;br /&gt;
! Operation&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 0x14f&lt;br /&gt;
| Configure endpoints for quad-buffered bulk FIFO operation, and trigger a GPIF read on EP2.&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 0x157&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| 0x15f&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| 0x1b3&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7a&lt;br /&gt;
| 0x309&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7b&lt;br /&gt;
| 0x346&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7c&lt;br /&gt;
| 0x282&lt;br /&gt;
| Re-renumerate; return control to the builtin bootloader.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7d&lt;br /&gt;
| 0x2aa&lt;br /&gt;
| Abort the GPIF.  The second byte of the packet is returned complemented in an IN transfer, as acknowledgement.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7e&lt;br /&gt;
| 0x2cf&lt;br /&gt;
| Configure the GPIF, and prepare the FPGA for bitstream upload by pulsing PROG_B and then waiting for INIT_B.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7f&lt;br /&gt;
| 0x2e4&lt;br /&gt;
| Transmit N (1-62) bytes of bitstream on the FPGA DIN pin, clocked by CCLK.  The second byte of the packet encodes N.&lt;br /&gt;
|-&lt;br /&gt;
| 0x80&lt;br /&gt;
| 0x205&lt;br /&gt;
| Transmit N (1-31) 16-bit words to the FPGA.  The second byte of the packet encodes N. Data is sent on PA6, MSB first, with rising edges of PA5 to clock the bits out. During each word transfer, PA4 is held low.  The most significant bit (b15) of each word must be 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x81&lt;br /&gt;
| 0x23b&lt;br /&gt;
| Perform N (1-31) write-read transactions to the FPGA.  The second byte of the packet encodes N.  Each transaction consists of 8 bits (from the out packet) being transmitted on PA6, like for the 0x80 operation above, and then 8 bits being received on PA7.  N bytes will be available for an IN transfer afterwards.  The most significant bit (b7) of each byte to send must be 0, but is actually transmitted as a 1 (to indicate read operation).  PA7 is polled immediately after the falling edge of PA5.  PA4 is held low during each write-read transaction.&lt;br /&gt;
|-&lt;br /&gt;
| 0x82&lt;br /&gt;
| 0x3a3&lt;br /&gt;
| Read the REVID register.  16 bits of REVID data will be available for an IN transfer.&lt;br /&gt;
|-&lt;br /&gt;
| others&lt;br /&gt;
| 0x3c7&lt;br /&gt;
| Do nothing&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Command 0x80 waveform ====&lt;br /&gt;
[[File:Logic16 FW Command 0x80 Waveform.svg]]&lt;br /&gt;
==== Command 0x81 waveform ====&lt;br /&gt;
[[File:Logic16 FW Command 0x81 Waveform.svg]]&lt;/div&gt;</summary>
		<author><name>Marcus Comstedt</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=Saleae_Logic16/Firmware&amp;diff=6809</id>
		<title>Saleae Logic16/Firmware</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=Saleae_Logic16/Firmware&amp;diff=6809"/>
		<updated>2013-07-26T12:25:29Z</updated>

		<summary type="html">&lt;p&gt;Marcus Comstedt: /* Endpoint 1 OUT (EP1_OUT) handler */ Explain operations 0x7c and 0x7d.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The following information is related to the vendor firmware included with the&lt;br /&gt;
version 1.1.15 of the vendor application &amp;quot;Logic&amp;quot;.&lt;br /&gt;
== Interrupt handlers ==&lt;br /&gt;
The following interrupt handlers are installed.  If the address is absent, it means the handler just returns (RETI) without performing any action.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|RESET&lt;br /&gt;
|0x0000&lt;br /&gt;
|-&lt;br /&gt;
|TF2&lt;br /&gt;
|0x0e65&lt;br /&gt;
|-&lt;br /&gt;
|RESUME&lt;br /&gt;
|0x002e&lt;br /&gt;
|-&lt;br /&gt;
|SUDAV&lt;br /&gt;
|0x0ae8&lt;br /&gt;
|-&lt;br /&gt;
|SOF&lt;br /&gt;
|0x13d2&lt;br /&gt;
|-&lt;br /&gt;
|SUTOK&lt;br /&gt;
|0x13bf&lt;br /&gt;
|-&lt;br /&gt;
|SUSPEND&lt;br /&gt;
|0x13aa&lt;br /&gt;
|-&lt;br /&gt;
|USB_RESET&lt;br /&gt;
|0x130b&lt;br /&gt;
|-&lt;br /&gt;
|HISPEED&lt;br /&gt;
|0x12df&lt;br /&gt;
|-&lt;br /&gt;
|EP0ACK&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP0_IN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP0_OUT&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP1_IN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP1_OUT&lt;br /&gt;
|0x115d&lt;br /&gt;
|-&lt;br /&gt;
|EP2&lt;br /&gt;
|0x11a2&lt;br /&gt;
|-&lt;br /&gt;
|EP4&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|IBN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP0PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP1PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|ERRLIMIT&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2ISOERR&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4ISOERRF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6ISOERR&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8ISOERRF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2FF&lt;br /&gt;
|0x11e7&lt;br /&gt;
|-&lt;br /&gt;
|EP4FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|GPIFDONE&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|GPIFWF&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Endpoint 1 OUT (EP1_OUT) handler ===&lt;br /&gt;
&lt;br /&gt;
After decrypting the OUT packet, processing of the packet proceeds depending on the first byte of the packet, which selects the operation.  After the operation, any resulting IN packet will be encrypted before submitting it to the host.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Byte&lt;br /&gt;
! Handler&lt;br /&gt;
! Operation&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 0x14f&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 0x157&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| 0x15f&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| 0x1b3&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7a&lt;br /&gt;
| 0x309&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7b&lt;br /&gt;
| 0x346&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7c&lt;br /&gt;
| 0x282&lt;br /&gt;
| Re-renumerate; return control to the builtin bootloader.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7d&lt;br /&gt;
| 0x2aa&lt;br /&gt;
| Abort the GPIF.  The second byte of the packet is returned complemented in an IN transfer, as acknowledgement.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7e&lt;br /&gt;
| 0x2cf&lt;br /&gt;
| Configure the GPIF, and prepare the FPGA for bitstream upload by pulsing PROG_B and then waiting for INIT_B.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7f&lt;br /&gt;
| 0x2e4&lt;br /&gt;
| Transmit N (1-62) bytes of bitstream on the FPGA DIN pin, clocked by CCLK.  The second byte of the packet encodes N.&lt;br /&gt;
|-&lt;br /&gt;
| 0x80&lt;br /&gt;
| 0x205&lt;br /&gt;
| Transmit N (1-31) 16-bit words to the FPGA.  The second byte of the packet encodes N. Data is sent on PA6, MSB first, with rising edges of PA5 to clock the bits out. During each word transfer, PA4 is held low.  The most significant bit (b15) of each word must be 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x81&lt;br /&gt;
| 0x23b&lt;br /&gt;
| Perform N (1-31) write-read transactions to the FPGA.  The second byte of the packet encodes N.  Each transaction consists of 8 bits (from the out packet) being transmitted on PA6, like for the 0x80 operation above, and then 8 bits being received on PA7.  N bytes will be available for an IN transfer afterwards.  The most significant bit (b7) of each byte to send must be 0, but is actually transmitted as a 1 (to indicate read operation).  PA7 is polled immediately after the falling edge of PA5.  PA4 is held low during each write-read transaction.&lt;br /&gt;
|-&lt;br /&gt;
| 0x82&lt;br /&gt;
| 0x3a3&lt;br /&gt;
| Read the REVID register.  16 bits of REVID data will be available for an IN transfer.&lt;br /&gt;
|-&lt;br /&gt;
| others&lt;br /&gt;
| 0x3c7&lt;br /&gt;
| Do nothing&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Command 0x80 waveform ====&lt;br /&gt;
[[File:Logic16 FW Command 0x80 Waveform.svg]]&lt;br /&gt;
==== Command 0x81 waveform ====&lt;br /&gt;
[[File:Logic16 FW Command 0x81 Waveform.svg]]&lt;/div&gt;</summary>
		<author><name>Marcus Comstedt</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=Saleae_Logic16/Firmware&amp;diff=6806</id>
		<title>Saleae Logic16/Firmware</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=Saleae_Logic16/Firmware&amp;diff=6806"/>
		<updated>2013-07-25T21:35:39Z</updated>

		<summary type="html">&lt;p&gt;Marcus Comstedt: /* Endpoint 1 OUT (EP1_OUT) handler */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The following information is related to the vendor firmware included with the&lt;br /&gt;
version 1.1.15 of the vendor application &amp;quot;Logic&amp;quot;.&lt;br /&gt;
== Interrupt handlers ==&lt;br /&gt;
The following interrupt handlers are installed.  If the address is absent, it means the handler just returns (RETI) without performing any action.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|RESET&lt;br /&gt;
|0x0000&lt;br /&gt;
|-&lt;br /&gt;
|TF2&lt;br /&gt;
|0x0e65&lt;br /&gt;
|-&lt;br /&gt;
|RESUME&lt;br /&gt;
|0x002e&lt;br /&gt;
|-&lt;br /&gt;
|SUDAV&lt;br /&gt;
|0x0ae8&lt;br /&gt;
|-&lt;br /&gt;
|SOF&lt;br /&gt;
|0x13d2&lt;br /&gt;
|-&lt;br /&gt;
|SUTOK&lt;br /&gt;
|0x13bf&lt;br /&gt;
|-&lt;br /&gt;
|SUSPEND&lt;br /&gt;
|0x13aa&lt;br /&gt;
|-&lt;br /&gt;
|USB_RESET&lt;br /&gt;
|0x130b&lt;br /&gt;
|-&lt;br /&gt;
|HISPEED&lt;br /&gt;
|0x12df&lt;br /&gt;
|-&lt;br /&gt;
|EP0ACK&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP0_IN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP0_OUT&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP1_IN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP1_OUT&lt;br /&gt;
|0x115d&lt;br /&gt;
|-&lt;br /&gt;
|EP2&lt;br /&gt;
|0x11a2&lt;br /&gt;
|-&lt;br /&gt;
|EP4&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|IBN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP0PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP1PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|ERRLIMIT&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2ISOERR&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4ISOERRF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6ISOERR&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8ISOERRF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2FF&lt;br /&gt;
|0x11e7&lt;br /&gt;
|-&lt;br /&gt;
|EP4FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|GPIFDONE&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|GPIFWF&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Endpoint 1 OUT (EP1_OUT) handler ===&lt;br /&gt;
&lt;br /&gt;
After decrypting the OUT packet, processing of the packet proceeds depending on the first byte of the packet, which selects the operation.  After the operation, any resulting IN packet will be encrypted before submitting it to the host.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Byte&lt;br /&gt;
! Handler&lt;br /&gt;
! Operation&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 0x14f&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 0x157&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| 0x15f&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| 0x1b3&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7a&lt;br /&gt;
| 0x309&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7b&lt;br /&gt;
| 0x346&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7c&lt;br /&gt;
| 0x282&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7d&lt;br /&gt;
| 0x2aa&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7e&lt;br /&gt;
| 0x2cf&lt;br /&gt;
| Configure the GPIF, and prepare the FPGA for bitstream upload by pulsing PROG_B and then waiting for INIT_B.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7f&lt;br /&gt;
| 0x2e4&lt;br /&gt;
| Transmit N (1-62) bytes of bitstream on the FPGA DIN pin, clocked by CCLK.  The second byte of the packet encodes N.&lt;br /&gt;
|-&lt;br /&gt;
| 0x80&lt;br /&gt;
| 0x205&lt;br /&gt;
| Transmit N (1-31) 16-bit words to the FPGA.  The second byte of the packet encodes N. Data is sent on PA6, MSB first, with rising edges of PA5 to clock the bits out. During each word transfer, PA4 is held low.  The most significant bit (b15) of each word must be 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x81&lt;br /&gt;
| 0x23b&lt;br /&gt;
| Perform N (1-31) write-read transactions to the FPGA.  The second byte of the packet encodes N.  Each transaction consists of 8 bits (from the out packet) being transmitted on PA6, like for the 0x80 operation above, and then 8 bits being received on PA7.  N bytes will be available for an IN transfer afterwards.  The most significant bit (b7) of each byte to send must be 0, but is actually transmitted as a 1 (to indicate read operation).  PA7 is polled immediately after the falling edge of PA5.  PA4 is held low during each write-read transaction.&lt;br /&gt;
|-&lt;br /&gt;
| 0x82&lt;br /&gt;
| 0x3a3&lt;br /&gt;
| Read the REVID register.  16 bits of REVID data will be available for an IN transfer.&lt;br /&gt;
|-&lt;br /&gt;
| others&lt;br /&gt;
| 0x3c7&lt;br /&gt;
| Do nothing&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Command 0x80 waveform ====&lt;br /&gt;
[[File:Logic16 FW Command 0x80 Waveform.svg]]&lt;br /&gt;
==== Command 0x81 waveform ====&lt;br /&gt;
[[File:Logic16 FW Command 0x81 Waveform.svg]]&lt;/div&gt;</summary>
		<author><name>Marcus Comstedt</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=Saleae_Logic16/Firmware&amp;diff=6805</id>
		<title>Saleae Logic16/Firmware</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=Saleae_Logic16/Firmware&amp;diff=6805"/>
		<updated>2013-07-25T21:32:26Z</updated>

		<summary type="html">&lt;p&gt;Marcus Comstedt: /* Endpoint 1 OUT (EP1_OUT) handler */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The following information is related to the vendor firmware included with the&lt;br /&gt;
version 1.1.15 of the vendor application &amp;quot;Logic&amp;quot;.&lt;br /&gt;
== Interrupt handlers ==&lt;br /&gt;
The following interrupt handlers are installed.  If the address is absent, it means the handler just returns (RETI) without performing any action.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|RESET&lt;br /&gt;
|0x0000&lt;br /&gt;
|-&lt;br /&gt;
|TF2&lt;br /&gt;
|0x0e65&lt;br /&gt;
|-&lt;br /&gt;
|RESUME&lt;br /&gt;
|0x002e&lt;br /&gt;
|-&lt;br /&gt;
|SUDAV&lt;br /&gt;
|0x0ae8&lt;br /&gt;
|-&lt;br /&gt;
|SOF&lt;br /&gt;
|0x13d2&lt;br /&gt;
|-&lt;br /&gt;
|SUTOK&lt;br /&gt;
|0x13bf&lt;br /&gt;
|-&lt;br /&gt;
|SUSPEND&lt;br /&gt;
|0x13aa&lt;br /&gt;
|-&lt;br /&gt;
|USB_RESET&lt;br /&gt;
|0x130b&lt;br /&gt;
|-&lt;br /&gt;
|HISPEED&lt;br /&gt;
|0x12df&lt;br /&gt;
|-&lt;br /&gt;
|EP0ACK&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP0_IN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP0_OUT&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP1_IN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP1_OUT&lt;br /&gt;
|0x115d&lt;br /&gt;
|-&lt;br /&gt;
|EP2&lt;br /&gt;
|0x11a2&lt;br /&gt;
|-&lt;br /&gt;
|EP4&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|IBN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP0PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP1PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|ERRLIMIT&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2ISOERR&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4ISOERRF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6ISOERR&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8ISOERRF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2FF&lt;br /&gt;
|0x11e7&lt;br /&gt;
|-&lt;br /&gt;
|EP4FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|GPIFDONE&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|GPIFWF&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Endpoint 1 OUT (EP1_OUT) handler ===&lt;br /&gt;
&lt;br /&gt;
After decrypting the OUT packet, processing of the packet proceeds depending on the first byte of the packet, which selects the operation.  After the operation, any resulting IN packet will be encrypted before submitting it to the host.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Byte&lt;br /&gt;
! Handler&lt;br /&gt;
! Operation&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 0x14f&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 0x157&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| 0x15f&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| 0x1b3&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7a&lt;br /&gt;
| 0x309&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7b&lt;br /&gt;
| 0x346&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7c&lt;br /&gt;
| 0x282&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7d&lt;br /&gt;
| 0x2aa&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7e&lt;br /&gt;
| 0x2cf&lt;br /&gt;
| Configure the GPIF, and prepare the FPGA for bitstream upload by pulsing PROG_B and then waiting for INIT_B.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7f&lt;br /&gt;
| 0x2e4&lt;br /&gt;
| Transmit N (1-62) bytes of bitstream on the FPGA DIN pin, clocked by CCLK.&lt;br /&gt;
|-&lt;br /&gt;
| 0x80&lt;br /&gt;
| 0x205&lt;br /&gt;
| Transmit N (1-31) 16-bit words to the FPGA.  The second byte of the packet encodes N. Data is sent on PA6, MSB first, with rising edges of PA5 to clock the bits out. During each word transfer, PA4 is held low.  The most significant bit (b15) of each word must be 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x81&lt;br /&gt;
| 0x23b&lt;br /&gt;
| Perform N (1-31) write-read transactions to the FPGA.  The second byte of the packet encodes N.  Each transaction consists of 8 bits (from the out packet) being transmitted on PA6, like for the 0x80 operation above, and then 8 bits being received on PA7.  N bytes will be available for an IN transfer afterwards.  The most significant bit (b7) of each byte to send must be 0, but is actually transmitted as a 1 (to indicate read operation).  PA7 is polled immediately after the falling edge of PA5.  PA4 is held low during each write-read transaction.&lt;br /&gt;
|-&lt;br /&gt;
| 0x82&lt;br /&gt;
| 0x3a3&lt;br /&gt;
| Read the REVID register.  16 bits of REVID data will be available for an IN transfer.&lt;br /&gt;
|-&lt;br /&gt;
| others&lt;br /&gt;
| 0x3c7&lt;br /&gt;
| Do nothing&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Command 0x80 waveform ====&lt;br /&gt;
[[File:Logic16 FW Command 0x80 Waveform.svg]]&lt;br /&gt;
==== Command 0x81 waveform ====&lt;br /&gt;
[[File:Logic16 FW Command 0x81 Waveform.svg]]&lt;/div&gt;</summary>
		<author><name>Marcus Comstedt</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=Saleae_Logic16/Firmware&amp;diff=6804</id>
		<title>Saleae Logic16/Firmware</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=Saleae_Logic16/Firmware&amp;diff=6804"/>
		<updated>2013-07-25T21:31:41Z</updated>

		<summary type="html">&lt;p&gt;Marcus Comstedt: /* Endpoint 1 OUT (EP1_OUT) handler */ Explain operations 0x7e and 0x7f&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The following information is related to the vendor firmware included with the&lt;br /&gt;
version 1.1.15 of the vendor application &amp;quot;Logic&amp;quot;.&lt;br /&gt;
== Interrupt handlers ==&lt;br /&gt;
The following interrupt handlers are installed.  If the address is absent, it means the handler just returns (RETI) without performing any action.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|RESET&lt;br /&gt;
|0x0000&lt;br /&gt;
|-&lt;br /&gt;
|TF2&lt;br /&gt;
|0x0e65&lt;br /&gt;
|-&lt;br /&gt;
|RESUME&lt;br /&gt;
|0x002e&lt;br /&gt;
|-&lt;br /&gt;
|SUDAV&lt;br /&gt;
|0x0ae8&lt;br /&gt;
|-&lt;br /&gt;
|SOF&lt;br /&gt;
|0x13d2&lt;br /&gt;
|-&lt;br /&gt;
|SUTOK&lt;br /&gt;
|0x13bf&lt;br /&gt;
|-&lt;br /&gt;
|SUSPEND&lt;br /&gt;
|0x13aa&lt;br /&gt;
|-&lt;br /&gt;
|USB_RESET&lt;br /&gt;
|0x130b&lt;br /&gt;
|-&lt;br /&gt;
|HISPEED&lt;br /&gt;
|0x12df&lt;br /&gt;
|-&lt;br /&gt;
|EP0ACK&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP0_IN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP0_OUT&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP1_IN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP1_OUT&lt;br /&gt;
|0x115d&lt;br /&gt;
|-&lt;br /&gt;
|EP2&lt;br /&gt;
|0x11a2&lt;br /&gt;
|-&lt;br /&gt;
|EP4&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|IBN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP0PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP1PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|ERRLIMIT&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2ISOERR&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4ISOERRF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6ISOERR&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8ISOERRF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2FF&lt;br /&gt;
|0x11e7&lt;br /&gt;
|-&lt;br /&gt;
|EP4FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|GPIFDONE&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|GPIFWF&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Endpoint 1 OUT (EP1_OUT) handler ===&lt;br /&gt;
&lt;br /&gt;
After decrypting the OUT packet, processing of the packet proceeds depending on the first byte of the packet, which selects the operation.  After the operation, any resulting IN packet will be encrypted before submitting it to the host.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Byte&lt;br /&gt;
! Handler&lt;br /&gt;
! Operation&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 0x14f&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 0x157&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| 0x15f&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| 0x1b3&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7a&lt;br /&gt;
| 0x309&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7b&lt;br /&gt;
| 0x346&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7c&lt;br /&gt;
| 0x282&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7d&lt;br /&gt;
| 0x2aa&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7e&lt;br /&gt;
| 0x2cf&lt;br /&gt;
| Configure the GPIF, and prepare the FPGA for bitstream upload by pulsing PROG_B and then waiting for INIT_B.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7f&lt;br /&gt;
| 0x2e4&lt;br /&gt;
| Transmit N (1-62) bytes of bitstream ot the FPGA DIN pin, clocked by CCLK.&lt;br /&gt;
|-&lt;br /&gt;
| 0x80&lt;br /&gt;
| 0x205&lt;br /&gt;
| Transmit N (1-31) 16-bit words to the FPGA.  The second byte of the packet encodes N. Data is sent on PA6, MSB first, with rising edges of PA5 to clock the bits out. During each word transfer, PA4 is held low.  The most significant bit (b15) of each word must be 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x81&lt;br /&gt;
| 0x23b&lt;br /&gt;
| Perform N (1-31) write-read transactions to the FPGA.  The second byte of the packet encodes N.  Each transaction consists of 8 bits (from the out packet) being transmitted on PA6, like for the 0x80 operation above, and then 8 bits being received on PA7.  N bytes will be available for an IN transfer afterwards.  The most significant bit (b7) of each byte to send must be 0, but is actually transmitted as a 1 (to indicate read operation).  PA7 is polled immediately after the falling edge of PA5.  PA4 is held low during each write-read transaction.&lt;br /&gt;
|-&lt;br /&gt;
| 0x82&lt;br /&gt;
| 0x3a3&lt;br /&gt;
| Read the REVID register.  16 bits of REVID data will be available for an IN transfer.&lt;br /&gt;
|-&lt;br /&gt;
| others&lt;br /&gt;
| 0x3c7&lt;br /&gt;
| Do nothing&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Command 0x80 waveform ====&lt;br /&gt;
[[File:Logic16 FW Command 0x80 Waveform.svg]]&lt;br /&gt;
==== Command 0x81 waveform ====&lt;br /&gt;
[[File:Logic16 FW Command 0x81 Waveform.svg]]&lt;/div&gt;</summary>
		<author><name>Marcus Comstedt</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=Saleae_Logic16/Firmware&amp;diff=6803</id>
		<title>Saleae Logic16/Firmware</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=Saleae_Logic16/Firmware&amp;diff=6803"/>
		<updated>2013-07-25T21:25:26Z</updated>

		<summary type="html">&lt;p&gt;Marcus Comstedt: /* Endpoint 1 OUT (EP1_OUT) handler */ Added waveforms for command 0x80 and 0x81&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The following information is related to the vendor firmware included with the&lt;br /&gt;
version 1.1.15 of the vendor application &amp;quot;Logic&amp;quot;.&lt;br /&gt;
== Interrupt handlers ==&lt;br /&gt;
The following interrupt handlers are installed.  If the address is absent, it means the handler just returns (RETI) without performing any action.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|RESET&lt;br /&gt;
|0x0000&lt;br /&gt;
|-&lt;br /&gt;
|TF2&lt;br /&gt;
|0x0e65&lt;br /&gt;
|-&lt;br /&gt;
|RESUME&lt;br /&gt;
|0x002e&lt;br /&gt;
|-&lt;br /&gt;
|SUDAV&lt;br /&gt;
|0x0ae8&lt;br /&gt;
|-&lt;br /&gt;
|SOF&lt;br /&gt;
|0x13d2&lt;br /&gt;
|-&lt;br /&gt;
|SUTOK&lt;br /&gt;
|0x13bf&lt;br /&gt;
|-&lt;br /&gt;
|SUSPEND&lt;br /&gt;
|0x13aa&lt;br /&gt;
|-&lt;br /&gt;
|USB_RESET&lt;br /&gt;
|0x130b&lt;br /&gt;
|-&lt;br /&gt;
|HISPEED&lt;br /&gt;
|0x12df&lt;br /&gt;
|-&lt;br /&gt;
|EP0ACK&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP0_IN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP0_OUT&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP1_IN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP1_OUT&lt;br /&gt;
|0x115d&lt;br /&gt;
|-&lt;br /&gt;
|EP2&lt;br /&gt;
|0x11a2&lt;br /&gt;
|-&lt;br /&gt;
|EP4&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|IBN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP0PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP1PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|ERRLIMIT&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2ISOERR&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4ISOERRF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6ISOERR&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8ISOERRF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2FF&lt;br /&gt;
|0x11e7&lt;br /&gt;
|-&lt;br /&gt;
|EP4FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|GPIFDONE&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|GPIFWF&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Endpoint 1 OUT (EP1_OUT) handler ===&lt;br /&gt;
&lt;br /&gt;
After decrypting the OUT packet, processing of the packet proceeds depending on the first byte of the packet, which selects the operation.  After the operation, any resulting IN packet will be encrypted before submitting it to the host.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Byte&lt;br /&gt;
! Handler&lt;br /&gt;
! Operation&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 0x14f&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 0x157&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| 0x15f&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| 0x1b3&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7a&lt;br /&gt;
| 0x309&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7b&lt;br /&gt;
| 0x346&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7c&lt;br /&gt;
| 0x282&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7d&lt;br /&gt;
| 0x2aa&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7e&lt;br /&gt;
| 0x2cf&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7f&lt;br /&gt;
| 0x2e4&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80&lt;br /&gt;
| 0x205&lt;br /&gt;
| Transmit N (1-31) 16-bit words to the FPGA.  The second byte of the packet encodes N. Data is sent on PA6, MSB first, with rising edges of PA5 to clock the bits out. During each word transfer, PA4 is held low.  The most significant bit (b15) of each word must be 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x81&lt;br /&gt;
| 0x23b&lt;br /&gt;
| Perform N (1-31) write-read transactions to the FPGA.  The second byte of the packet encodes N.  Each transaction consists of 8 bits (from the out packet) being transmitted on PA6, like for the 0x80 operation above, and then 8 bits being received on PA7.  N bytes will be available for an IN transfer afterwards.  The most significant bit (b7) of each byte to send must be 0, but is actually transmitted as a 1 (to indicate read operation).  PA7 is polled immediately after the falling edge of PA5.  PA4 is held low during each write-read transaction.&lt;br /&gt;
|-&lt;br /&gt;
| 0x82&lt;br /&gt;
| 0x3a3&lt;br /&gt;
| Read the REVID register.  16 bits of REVID data will be available for an IN transfer.&lt;br /&gt;
|-&lt;br /&gt;
| others&lt;br /&gt;
| 0x3c7&lt;br /&gt;
| Do nothing&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Command 0x80 waveform ====&lt;br /&gt;
[[File:Logic16 FW Command 0x80 Waveform.svg]]&lt;br /&gt;
==== Command 0x81 waveform ====&lt;br /&gt;
[[File:Logic16 FW Command 0x81 Waveform.svg]]&lt;/div&gt;</summary>
		<author><name>Marcus Comstedt</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=File:Logic16_FW_Command_0x81_Waveform.svg&amp;diff=6802</id>
		<title>File:Logic16 FW Command 0x81 Waveform.svg</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=File:Logic16_FW_Command_0x81_Waveform.svg&amp;diff=6802"/>
		<updated>2013-07-25T21:20:58Z</updated>

		<summary type="html">&lt;p&gt;Marcus Comstedt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Licensing ==&lt;br /&gt;
{{PD}}&lt;/div&gt;</summary>
		<author><name>Marcus Comstedt</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=File:Logic16_FW_Command_0x80_Waveform.svg&amp;diff=6801</id>
		<title>File:Logic16 FW Command 0x80 Waveform.svg</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=File:Logic16_FW_Command_0x80_Waveform.svg&amp;diff=6801"/>
		<updated>2013-07-25T21:05:25Z</updated>

		<summary type="html">&lt;p&gt;Marcus Comstedt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Licensing ==&lt;br /&gt;
{{PD}}&lt;/div&gt;</summary>
		<author><name>Marcus Comstedt</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=Saleae_Logic16/Firmware&amp;diff=6789</id>
		<title>Saleae Logic16/Firmware</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=Saleae_Logic16/Firmware&amp;diff=6789"/>
		<updated>2013-07-24T20:38:41Z</updated>

		<summary type="html">&lt;p&gt;Marcus Comstedt: /* Endpoint 1 OUT (EP1_OUT) handler */ Mention IN encryption&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The following information is related to the vendor firmware included with the&lt;br /&gt;
version 1.1.15 of the vendor application &amp;quot;Logic&amp;quot;.&lt;br /&gt;
== Interrupt handlers ==&lt;br /&gt;
The following interrupt handlers are installed.  If the address is absent, it means the handler just returns (RETI) without performing any action.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|RESET&lt;br /&gt;
|0x0000&lt;br /&gt;
|-&lt;br /&gt;
|TF2&lt;br /&gt;
|0x0e65&lt;br /&gt;
|-&lt;br /&gt;
|RESUME&lt;br /&gt;
|0x002e&lt;br /&gt;
|-&lt;br /&gt;
|SUDAV&lt;br /&gt;
|0x0ae8&lt;br /&gt;
|-&lt;br /&gt;
|SOF&lt;br /&gt;
|0x13d2&lt;br /&gt;
|-&lt;br /&gt;
|SUTOK&lt;br /&gt;
|0x13bf&lt;br /&gt;
|-&lt;br /&gt;
|SUSPEND&lt;br /&gt;
|0x13aa&lt;br /&gt;
|-&lt;br /&gt;
|USB_RESET&lt;br /&gt;
|0x130b&lt;br /&gt;
|-&lt;br /&gt;
|HISPEED&lt;br /&gt;
|0x12df&lt;br /&gt;
|-&lt;br /&gt;
|EP0ACK&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP0_IN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP0_OUT&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP1_IN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP1_OUT&lt;br /&gt;
|0x115d&lt;br /&gt;
|-&lt;br /&gt;
|EP2&lt;br /&gt;
|0x11a2&lt;br /&gt;
|-&lt;br /&gt;
|EP4&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|IBN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP0PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP1PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|ERRLIMIT&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2ISOERR&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4ISOERRF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6ISOERR&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8ISOERRF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2FF&lt;br /&gt;
|0x11e7&lt;br /&gt;
|-&lt;br /&gt;
|EP4FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|GPIFDONE&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|GPIFWF&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Endpoint 1 OUT (EP1_OUT) handler ===&lt;br /&gt;
&lt;br /&gt;
After decrypting the OUT packet, processing of the packet proceeds depending on the first byte of the packet, which selects the operation.  After the operation, any resulting IN packet will be encrypted before submitting it to the host.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Byte&lt;br /&gt;
! Handler&lt;br /&gt;
! Operation&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 0x14f&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 0x157&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| 0x15f&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| 0x1b3&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7a&lt;br /&gt;
| 0x309&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7b&lt;br /&gt;
| 0x346&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7c&lt;br /&gt;
| 0x282&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7d&lt;br /&gt;
| 0x2aa&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7e&lt;br /&gt;
| 0x2cf&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7f&lt;br /&gt;
| 0x2e4&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80&lt;br /&gt;
| 0x205&lt;br /&gt;
| Transmit N (1-31) 16-bit words to the FPGA.  The second byte of the packet encodes N. Data is sent on PA6, MSB first, with rising edges of PA5 to clock the bits out. During each word transfer, PA4 is held low.  The most significant bit (b15) of each word must be 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x81&lt;br /&gt;
| 0x23b&lt;br /&gt;
| Perform N (1-31) write-read transactions to the FPGA.  The second byte of the packet encodes N.  Each transaction consists of 8 bits (from the out packet) being transmitted on PA6, like for the 0x80 operation above, and then 8 bits being received on PA7.  N bytes will be available for an IN transfer afterwards.  The most significant bit (b7) of each byte to send must be 0, but is actually transmitted as a 1 (to indicate read operation).  PA7 is polled immediately after the falling edge of PA5.  PA4 is held low during each write-read transaction.&lt;br /&gt;
|-&lt;br /&gt;
| 0x82&lt;br /&gt;
| 0x3a3&lt;br /&gt;
| Read the REVID register.  16 bits of REVID data will be available for an IN transfer.&lt;br /&gt;
|-&lt;br /&gt;
| others&lt;br /&gt;
| 0x3c7&lt;br /&gt;
| Do nothing&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Marcus Comstedt</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=Saleae_Logic16/Firmware&amp;diff=6788</id>
		<title>Saleae Logic16/Firmware</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=Saleae_Logic16/Firmware&amp;diff=6788"/>
		<updated>2013-07-24T20:37:43Z</updated>

		<summary type="html">&lt;p&gt;Marcus Comstedt: /* Endpoint 1 OUT (EP1_OUT) handler */ Explain operation 0x82&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The following information is related to the vendor firmware included with the&lt;br /&gt;
version 1.1.15 of the vendor application &amp;quot;Logic&amp;quot;.&lt;br /&gt;
== Interrupt handlers ==&lt;br /&gt;
The following interrupt handlers are installed.  If the address is absent, it means the handler just returns (RETI) without performing any action.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|RESET&lt;br /&gt;
|0x0000&lt;br /&gt;
|-&lt;br /&gt;
|TF2&lt;br /&gt;
|0x0e65&lt;br /&gt;
|-&lt;br /&gt;
|RESUME&lt;br /&gt;
|0x002e&lt;br /&gt;
|-&lt;br /&gt;
|SUDAV&lt;br /&gt;
|0x0ae8&lt;br /&gt;
|-&lt;br /&gt;
|SOF&lt;br /&gt;
|0x13d2&lt;br /&gt;
|-&lt;br /&gt;
|SUTOK&lt;br /&gt;
|0x13bf&lt;br /&gt;
|-&lt;br /&gt;
|SUSPEND&lt;br /&gt;
|0x13aa&lt;br /&gt;
|-&lt;br /&gt;
|USB_RESET&lt;br /&gt;
|0x130b&lt;br /&gt;
|-&lt;br /&gt;
|HISPEED&lt;br /&gt;
|0x12df&lt;br /&gt;
|-&lt;br /&gt;
|EP0ACK&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP0_IN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP0_OUT&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP1_IN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP1_OUT&lt;br /&gt;
|0x115d&lt;br /&gt;
|-&lt;br /&gt;
|EP2&lt;br /&gt;
|0x11a2&lt;br /&gt;
|-&lt;br /&gt;
|EP4&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|IBN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP0PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP1PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|ERRLIMIT&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2ISOERR&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4ISOERRF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6ISOERR&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8ISOERRF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2FF&lt;br /&gt;
|0x11e7&lt;br /&gt;
|-&lt;br /&gt;
|EP4FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|GPIFDONE&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|GPIFWF&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Endpoint 1 OUT (EP1_OUT) handler ===&lt;br /&gt;
&lt;br /&gt;
After decrypting the OUT packet, processing of the packet proceeds depending on the first byte of the packet, which selects the operation.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Byte&lt;br /&gt;
! Handler&lt;br /&gt;
! Operation&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 0x14f&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 0x157&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| 0x15f&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| 0x1b3&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7a&lt;br /&gt;
| 0x309&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7b&lt;br /&gt;
| 0x346&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7c&lt;br /&gt;
| 0x282&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7d&lt;br /&gt;
| 0x2aa&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7e&lt;br /&gt;
| 0x2cf&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7f&lt;br /&gt;
| 0x2e4&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80&lt;br /&gt;
| 0x205&lt;br /&gt;
| Transmit N (1-31) 16-bit words to the FPGA.  The second byte of the packet encodes N. Data is sent on PA6, MSB first, with rising edges of PA5 to clock the bits out. During each word transfer, PA4 is held low.  The most significant bit (b15) of each word must be 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x81&lt;br /&gt;
| 0x23b&lt;br /&gt;
| Perform N (1-31) write-read transactions to the FPGA.  The second byte of the packet encodes N.  Each transaction consists of 8 bits (from the out packet) being transmitted on PA6, like for the 0x80 operation above, and then 8 bits being received on PA7.  N bytes will be available for an IN transfer afterwards.  The most significant bit (b7) of each byte to send must be 0, but is actually transmitted as a 1 (to indicate read operation).  PA7 is polled immediately after the falling edge of PA5.  PA4 is held low during each write-read transaction.&lt;br /&gt;
|-&lt;br /&gt;
| 0x82&lt;br /&gt;
| 0x3a3&lt;br /&gt;
| Read the REVID register.  16 bits of REVID data will be available for an IN transfer.&lt;br /&gt;
|-&lt;br /&gt;
| others&lt;br /&gt;
| 0x3c7&lt;br /&gt;
| Do nothing&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Marcus Comstedt</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=Saleae_Logic16/Firmware&amp;diff=6787</id>
		<title>Saleae Logic16/Firmware</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=Saleae_Logic16/Firmware&amp;diff=6787"/>
		<updated>2013-07-24T20:31:16Z</updated>

		<summary type="html">&lt;p&gt;Marcus Comstedt: /* Endpoint 1 OUT (EP1_OUT) handler */ Explain operation 0x81&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The following information is related to the vendor firmware included with the&lt;br /&gt;
version 1.1.15 of the vendor application &amp;quot;Logic&amp;quot;.&lt;br /&gt;
== Interrupt handlers ==&lt;br /&gt;
The following interrupt handlers are installed.  If the address is absent, it means the handler just returns (RETI) without performing any action.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|RESET&lt;br /&gt;
|0x0000&lt;br /&gt;
|-&lt;br /&gt;
|TF2&lt;br /&gt;
|0x0e65&lt;br /&gt;
|-&lt;br /&gt;
|RESUME&lt;br /&gt;
|0x002e&lt;br /&gt;
|-&lt;br /&gt;
|SUDAV&lt;br /&gt;
|0x0ae8&lt;br /&gt;
|-&lt;br /&gt;
|SOF&lt;br /&gt;
|0x13d2&lt;br /&gt;
|-&lt;br /&gt;
|SUTOK&lt;br /&gt;
|0x13bf&lt;br /&gt;
|-&lt;br /&gt;
|SUSPEND&lt;br /&gt;
|0x13aa&lt;br /&gt;
|-&lt;br /&gt;
|USB_RESET&lt;br /&gt;
|0x130b&lt;br /&gt;
|-&lt;br /&gt;
|HISPEED&lt;br /&gt;
|0x12df&lt;br /&gt;
|-&lt;br /&gt;
|EP0ACK&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP0_IN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP0_OUT&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP1_IN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP1_OUT&lt;br /&gt;
|0x115d&lt;br /&gt;
|-&lt;br /&gt;
|EP2&lt;br /&gt;
|0x11a2&lt;br /&gt;
|-&lt;br /&gt;
|EP4&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|IBN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP0PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP1PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|ERRLIMIT&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2ISOERR&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4ISOERRF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6ISOERR&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8ISOERRF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2FF&lt;br /&gt;
|0x11e7&lt;br /&gt;
|-&lt;br /&gt;
|EP4FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|GPIFDONE&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|GPIFWF&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Endpoint 1 OUT (EP1_OUT) handler ===&lt;br /&gt;
&lt;br /&gt;
After decrypting the OUT packet, processing of the packet proceeds depending on the first byte of the packet, which selects the operation.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Byte&lt;br /&gt;
! Handler&lt;br /&gt;
! Operation&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 0x14f&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 0x157&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| 0x15f&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| 0x1b3&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7a&lt;br /&gt;
| 0x309&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7b&lt;br /&gt;
| 0x346&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7c&lt;br /&gt;
| 0x282&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7d&lt;br /&gt;
| 0x2aa&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7e&lt;br /&gt;
| 0x2cf&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7f&lt;br /&gt;
| 0x2e4&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80&lt;br /&gt;
| 0x205&lt;br /&gt;
| Transmit N (1-31) 16-bit words to the FPGA.  The second byte of the packet encodes N. Data is sent on PA6, MSB first, with rising edges of PA5 to clock the bits out. During each word transfer, PA4 is held low.  The most significant bit (b15) of each word must be 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x81&lt;br /&gt;
| 0x23b&lt;br /&gt;
| Perform N (1-31) write-read transactions to the FPGA.  The second byte of the packet encodes N.  Each transaction consists of 8 bits (from the out packet) being transmitted on PA6, like for the 0x80 operation above, and then 8 bits being received on PA7.  N bytes will be available for an IN transfer afterwards.  The most significant bit (b7) of each byte to send must be 0, but is actually transmitted as a 1 (to indicate read operation).  PA7 is polled immediately after the falling edge of PA5.  PA4 is held low during each write-read transaction.&lt;br /&gt;
|-&lt;br /&gt;
| 0x82&lt;br /&gt;
| 0x3a3&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| others&lt;br /&gt;
| 0x3c7&lt;br /&gt;
| Do nothing&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Marcus Comstedt</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=Saleae_Logic16/Firmware&amp;diff=6786</id>
		<title>Saleae Logic16/Firmware</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=Saleae_Logic16/Firmware&amp;diff=6786"/>
		<updated>2013-07-24T20:06:43Z</updated>

		<summary type="html">&lt;p&gt;Marcus Comstedt: /* Endpoint 1 OUT (EP1_OUT) handler */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The following information is related to the vendor firmware included with the&lt;br /&gt;
version 1.1.15 of the vendor application &amp;quot;Logic&amp;quot;.&lt;br /&gt;
== Interrupt handlers ==&lt;br /&gt;
The following interrupt handlers are installed.  If the address is absent, it means the handler just returns (RETI) without performing any action.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|RESET&lt;br /&gt;
|0x0000&lt;br /&gt;
|-&lt;br /&gt;
|TF2&lt;br /&gt;
|0x0e65&lt;br /&gt;
|-&lt;br /&gt;
|RESUME&lt;br /&gt;
|0x002e&lt;br /&gt;
|-&lt;br /&gt;
|SUDAV&lt;br /&gt;
|0x0ae8&lt;br /&gt;
|-&lt;br /&gt;
|SOF&lt;br /&gt;
|0x13d2&lt;br /&gt;
|-&lt;br /&gt;
|SUTOK&lt;br /&gt;
|0x13bf&lt;br /&gt;
|-&lt;br /&gt;
|SUSPEND&lt;br /&gt;
|0x13aa&lt;br /&gt;
|-&lt;br /&gt;
|USB_RESET&lt;br /&gt;
|0x130b&lt;br /&gt;
|-&lt;br /&gt;
|HISPEED&lt;br /&gt;
|0x12df&lt;br /&gt;
|-&lt;br /&gt;
|EP0ACK&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP0_IN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP0_OUT&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP1_IN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP1_OUT&lt;br /&gt;
|0x115d&lt;br /&gt;
|-&lt;br /&gt;
|EP2&lt;br /&gt;
|0x11a2&lt;br /&gt;
|-&lt;br /&gt;
|EP4&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|IBN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP0PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP1PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|ERRLIMIT&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2ISOERR&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4ISOERRF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6ISOERR&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8ISOERRF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2FF&lt;br /&gt;
|0x11e7&lt;br /&gt;
|-&lt;br /&gt;
|EP4FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|GPIFDONE&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|GPIFWF&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Endpoint 1 OUT (EP1_OUT) handler ===&lt;br /&gt;
&lt;br /&gt;
After decrypting the OUT packet, processing of the packet proceeds depending on the first byte of the packet, which selects the operation.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Byte&lt;br /&gt;
! Handler&lt;br /&gt;
! Operation&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 0x14f&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 0x157&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| 0x15f&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| 0x1b3&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7a&lt;br /&gt;
| 0x309&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7b&lt;br /&gt;
| 0x346&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7c&lt;br /&gt;
| 0x282&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7d&lt;br /&gt;
| 0x2aa&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7e&lt;br /&gt;
| 0x2cf&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7f&lt;br /&gt;
| 0x2e4&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80&lt;br /&gt;
| 0x205&lt;br /&gt;
| Transmit N (1-31) 16-bit words to the FPGA.  The second byte of the packet encodes N. Data is sent on PA6, MSB first, with rising edges of PA5 to clock the bits out. During each word transfer, PA4 is held low.  The most significant bit (b15) of each word must be 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x81&lt;br /&gt;
| 0x23b&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x82&lt;br /&gt;
| 0x3a3&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| others&lt;br /&gt;
| 0x3c7&lt;br /&gt;
| Do nothing&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Marcus Comstedt</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=Saleae_Logic16/Firmware&amp;diff=6785</id>
		<title>Saleae Logic16/Firmware</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=Saleae_Logic16/Firmware&amp;diff=6785"/>
		<updated>2013-07-24T20:04:48Z</updated>

		<summary type="html">&lt;p&gt;Marcus Comstedt: /* Endpoint 1 OUT (EP1_OUT) handler */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The following information is related to the vendor firmware included with the&lt;br /&gt;
version 1.1.15 of the vendor application &amp;quot;Logic&amp;quot;.&lt;br /&gt;
== Interrupt handlers ==&lt;br /&gt;
The following interrupt handlers are installed.  If the address is absent, it means the handler just returns (RETI) without performing any action.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|RESET&lt;br /&gt;
|0x0000&lt;br /&gt;
|-&lt;br /&gt;
|TF2&lt;br /&gt;
|0x0e65&lt;br /&gt;
|-&lt;br /&gt;
|RESUME&lt;br /&gt;
|0x002e&lt;br /&gt;
|-&lt;br /&gt;
|SUDAV&lt;br /&gt;
|0x0ae8&lt;br /&gt;
|-&lt;br /&gt;
|SOF&lt;br /&gt;
|0x13d2&lt;br /&gt;
|-&lt;br /&gt;
|SUTOK&lt;br /&gt;
|0x13bf&lt;br /&gt;
|-&lt;br /&gt;
|SUSPEND&lt;br /&gt;
|0x13aa&lt;br /&gt;
|-&lt;br /&gt;
|USB_RESET&lt;br /&gt;
|0x130b&lt;br /&gt;
|-&lt;br /&gt;
|HISPEED&lt;br /&gt;
|0x12df&lt;br /&gt;
|-&lt;br /&gt;
|EP0ACK&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP0_IN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP0_OUT&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP1_IN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP1_OUT&lt;br /&gt;
|0x115d&lt;br /&gt;
|-&lt;br /&gt;
|EP2&lt;br /&gt;
|0x11a2&lt;br /&gt;
|-&lt;br /&gt;
|EP4&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|IBN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP0PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP1PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|ERRLIMIT&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2ISOERR&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4ISOERRF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6ISOERR&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8ISOERRF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2FF&lt;br /&gt;
|0x11e7&lt;br /&gt;
|-&lt;br /&gt;
|EP4FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|GPIFDONE&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|GPIFWF&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Endpoint 1 OUT (EP1_OUT) handler ===&lt;br /&gt;
&lt;br /&gt;
After decrypting the OUT packet, processing of the packet proceeds depending on the first byte of the packet, which selects the operation.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Byte&lt;br /&gt;
! Handler&lt;br /&gt;
! Operation&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 0x14f&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 0x157&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| 0x15f&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| 0x1b3&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7a&lt;br /&gt;
| 0x309&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7b&lt;br /&gt;
| 0x346&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7c&lt;br /&gt;
| 0x282&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7d&lt;br /&gt;
| 0x2aa&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7e&lt;br /&gt;
| 0x2cf&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7f&lt;br /&gt;
| 0x2e4&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80&lt;br /&gt;
| 0x205&lt;br /&gt;
| Transmit N (1-31) 16-bit words to the FPGA.  The second byte of the packet encodes N. Data is sent on PA6, MSB first, with rising edges of PA5 to clock the bits out. During the transfer, PA4 is held low.  The most significant bit (b15) of each word must be 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x81&lt;br /&gt;
| 0x23b&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x82&lt;br /&gt;
| 0x3a3&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| others&lt;br /&gt;
| 0x3c7&lt;br /&gt;
| Do nothing&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Marcus Comstedt</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=Saleae_Logic16/Firmware&amp;diff=6784</id>
		<title>Saleae Logic16/Firmware</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=Saleae_Logic16/Firmware&amp;diff=6784"/>
		<updated>2013-07-24T20:03:16Z</updated>

		<summary type="html">&lt;p&gt;Marcus Comstedt: /* Endpoint 1 OUT (EP1_OUT) handler */  Explain operation 0x80&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The following information is related to the vendor firmware included with the&lt;br /&gt;
version 1.1.15 of the vendor application &amp;quot;Logic&amp;quot;.&lt;br /&gt;
== Interrupt handlers ==&lt;br /&gt;
The following interrupt handlers are installed.  If the address is absent, it means the handler just returns (RETI) without performing any action.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|RESET&lt;br /&gt;
|0x0000&lt;br /&gt;
|-&lt;br /&gt;
|TF2&lt;br /&gt;
|0x0e65&lt;br /&gt;
|-&lt;br /&gt;
|RESUME&lt;br /&gt;
|0x002e&lt;br /&gt;
|-&lt;br /&gt;
|SUDAV&lt;br /&gt;
|0x0ae8&lt;br /&gt;
|-&lt;br /&gt;
|SOF&lt;br /&gt;
|0x13d2&lt;br /&gt;
|-&lt;br /&gt;
|SUTOK&lt;br /&gt;
|0x13bf&lt;br /&gt;
|-&lt;br /&gt;
|SUSPEND&lt;br /&gt;
|0x13aa&lt;br /&gt;
|-&lt;br /&gt;
|USB_RESET&lt;br /&gt;
|0x130b&lt;br /&gt;
|-&lt;br /&gt;
|HISPEED&lt;br /&gt;
|0x12df&lt;br /&gt;
|-&lt;br /&gt;
|EP0ACK&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP0_IN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP0_OUT&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP1_IN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP1_OUT&lt;br /&gt;
|0x115d&lt;br /&gt;
|-&lt;br /&gt;
|EP2&lt;br /&gt;
|0x11a2&lt;br /&gt;
|-&lt;br /&gt;
|EP4&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|IBN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP0PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP1PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|ERRLIMIT&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2ISOERR&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4ISOERRF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6ISOERR&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8ISOERRF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2FF&lt;br /&gt;
|0x11e7&lt;br /&gt;
|-&lt;br /&gt;
|EP4FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|GPIFDONE&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|GPIFWF&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Endpoint 1 OUT (EP1_OUT) handler ===&lt;br /&gt;
&lt;br /&gt;
After decrypting the OUT packet, processing of the packet proceeds depending on the first byte of the packet, which selects the operation.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Byte&lt;br /&gt;
! Handler&lt;br /&gt;
! Operation&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 0x14f&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 0x157&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| 0x15f&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| 0x1b3&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7a&lt;br /&gt;
| 0x309&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7b&lt;br /&gt;
| 0x346&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7c&lt;br /&gt;
| 0x282&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7d&lt;br /&gt;
| 0x2aa&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7e&lt;br /&gt;
| 0x2cf&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7f&lt;br /&gt;
| 0x2e4&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80&lt;br /&gt;
| 0x205&lt;br /&gt;
| Transmit N (1-31) 16-bit words to the FPGA.  The second byte of the packet encodes N. Data is sent on PA6, with rising edges of PA5 to clock them out. During the transfer, PA4 is held low.  The most significant bit (b15) of each word must be 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x81&lt;br /&gt;
| 0x23b&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x82&lt;br /&gt;
| 0x3a3&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| others&lt;br /&gt;
| 0x3c7&lt;br /&gt;
| Do nothing&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Marcus Comstedt</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=Saleae_Logic16/Firmware&amp;diff=6783</id>
		<title>Saleae Logic16/Firmware</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=Saleae_Logic16/Firmware&amp;diff=6783"/>
		<updated>2013-07-24T18:01:34Z</updated>

		<summary type="html">&lt;p&gt;Marcus Comstedt: Added dispatch table for EP1_OUT handler&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The following information is related to the vendor firmware included with the&lt;br /&gt;
version 1.1.15 of the vendor application &amp;quot;Logic&amp;quot;.&lt;br /&gt;
== Interrupt handlers ==&lt;br /&gt;
The following interrupt handlers are installed.  If the address is absent, it means the handler just returns (RETI) without performing any action.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|RESET&lt;br /&gt;
|0x0000&lt;br /&gt;
|-&lt;br /&gt;
|TF2&lt;br /&gt;
|0x0e65&lt;br /&gt;
|-&lt;br /&gt;
|RESUME&lt;br /&gt;
|0x002e&lt;br /&gt;
|-&lt;br /&gt;
|SUDAV&lt;br /&gt;
|0x0ae8&lt;br /&gt;
|-&lt;br /&gt;
|SOF&lt;br /&gt;
|0x13d2&lt;br /&gt;
|-&lt;br /&gt;
|SUTOK&lt;br /&gt;
|0x13bf&lt;br /&gt;
|-&lt;br /&gt;
|SUSPEND&lt;br /&gt;
|0x13aa&lt;br /&gt;
|-&lt;br /&gt;
|USB_RESET&lt;br /&gt;
|0x130b&lt;br /&gt;
|-&lt;br /&gt;
|HISPEED&lt;br /&gt;
|0x12df&lt;br /&gt;
|-&lt;br /&gt;
|EP0ACK&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP0_IN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP0_OUT&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP1_IN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP1_OUT&lt;br /&gt;
|0x115d&lt;br /&gt;
|-&lt;br /&gt;
|EP2&lt;br /&gt;
|0x11a2&lt;br /&gt;
|-&lt;br /&gt;
|EP4&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|IBN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP0PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP1PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|ERRLIMIT&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2ISOERR&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4ISOERRF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6ISOERR&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8ISOERRF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2FF&lt;br /&gt;
|0x11e7&lt;br /&gt;
|-&lt;br /&gt;
|EP4FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|GPIFDONE&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|GPIFWF&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Endpoint 1 OUT (EP1_OUT) handler ===&lt;br /&gt;
&lt;br /&gt;
After decrypting the OUT packet, processing of the packet proceeds depending on the first byte of the packet, which selects the operation.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Byte&lt;br /&gt;
! Handler&lt;br /&gt;
! Operation&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 0x14f&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 0x157&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| 0x15f&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| 0x1b3&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7a&lt;br /&gt;
| 0x309&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7b&lt;br /&gt;
| 0x346&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7c&lt;br /&gt;
| 0x282&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7d&lt;br /&gt;
| 0x2aa&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7e&lt;br /&gt;
| 0x2cf&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7f&lt;br /&gt;
| 0x2e4&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x80&lt;br /&gt;
| 0x205&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x81&lt;br /&gt;
| 0x23b&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x82&lt;br /&gt;
| 0x3a3&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| others&lt;br /&gt;
| 0x3c7&lt;br /&gt;
| Do nothing&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Marcus Comstedt</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=Saleae_Logic16&amp;diff=6782</id>
		<title>Saleae Logic16</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=Saleae_Logic16&amp;diff=6782"/>
		<updated>2013-07-24T16:07:36Z</updated>

		<summary type="html">&lt;p&gt;Marcus Comstedt: /* Protocol */  Decrypted the configuration transfers&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox logic analyzer&lt;br /&gt;
| image            = [[File:Saleae Logic16.jpg|180px]]&lt;br /&gt;
| name             = Saleae Logic16&lt;br /&gt;
| status           = planned&lt;br /&gt;
| source_code_dir  = &lt;br /&gt;
| channels         = 2/4/8/16&lt;br /&gt;
| samplerate       = 100/50/25/12.5MHz&lt;br /&gt;
| samplerate_state = &amp;amp;mdash;&lt;br /&gt;
| triggers         = none (SW-only)&lt;br /&gt;
| voltages         = -0.9V &amp;amp;mdash; 6V&lt;br /&gt;
| threshold        = configurable:&amp;lt;br /&amp;gt;for 1.8V to 3.6V systems: VIH=1.4V, VIL=0.7V&amp;lt;br /&amp;gt;for 5V systems: VIH=3.6V, VIL=1.4V&lt;br /&gt;
| memory           = none&lt;br /&gt;
| compression      = yes&lt;br /&gt;
| website          = [http://www.saleae.com/logic16/ saleae.com]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
The &amp;#039;&amp;#039;&amp;#039;Saleae Logic16&amp;#039;&amp;#039;&amp;#039; is a USB-based, 16-channel logic analyzer with 100/50/25/12.5MHz sampling rate (at 2/4/8/16 enabled channels). &lt;br /&gt;
&lt;br /&gt;
The case requires a &amp;#039;&amp;#039;&amp;#039;Torx T5&amp;#039;&amp;#039;&amp;#039; screwdriver to open.&lt;br /&gt;
&lt;br /&gt;
See [[Saleae Logic16/Info]] for more details (such as &amp;#039;&amp;#039;&amp;#039;lsusb -vvv&amp;#039;&amp;#039;&amp;#039; output) about the device.&lt;br /&gt;
&lt;br /&gt;
See [[Saleae Logic]] for the predecessor product of the Saleae Logic16. &lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;FPGA&amp;#039;&amp;#039;&amp;#039;: [http://www.xilinx.com/support/index.html/content/xilinx/en/supportNav/silicon_devices/fpga/spartan-3a.html Xilinx Spartan-3A XC3S200A], 200K gates ([http://www.xilinx.com/support/documentation/data_sheets/ds529.pdf datasheeet])&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;USB interface chip&amp;#039;&amp;#039;&amp;#039;: [http://www.cypress.com/?mpn=CY7C68013A-56PVXC Cypress CY7C68013A-56PVXC (FX2LP)] ([http://www.cypress.com/?docID=34060 datasheet])&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ultralow capacitance ESD protection&amp;#039;&amp;#039;&amp;#039;: 4x [http://www.st.com/web/catalog/sense_power/FM114/CL1137/SC1490/PF109008 ST DVIULC6-4SC6] ([http://www.st.com/st-web-ui/static/active/en/resource/technical/document/datasheet/CD00065974.pdf datasheet])&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;I2C EEPROM&amp;#039;&amp;#039;&amp;#039;: Unknown. Marking: &amp;quot;B2TH&amp;quot;.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;?&amp;#039;&amp;#039;&amp;#039;: 2x Unknown 5-pin IC. Markings: &amp;quot;189Z&amp;quot; and &amp;quot;189C&amp;quot;.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;?&amp;#039;&amp;#039;&amp;#039;: 2x Unknown 3-pin IC. Markings: &amp;quot;72Y7&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Photos ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Saleae Logic16.jpg|&amp;lt;small&amp;gt;Device, front&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Saleae Logic16 bottom.jpg|&amp;lt;small&amp;gt;Device, bottom&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Saleae Logic16 PCB top.jpg|&amp;lt;small&amp;gt;PCB, top&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Saleae Logic16 PCB bottom.jpg|&amp;lt;small&amp;gt;PCB, bottom&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Firmware ==&lt;br /&gt;
&lt;br /&gt;
The firmware for the FX2LP is embedded in the vendor application as a set of Intel HEX lines.  Each line is uploaded individually with a separate control transfer.  The firmware currently occupies the address range [0x0000-0x145d], but is uploaded out of order.  &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;TODO&amp;lt;/span&amp;gt;: Make a tool to extract the firmware from the application binary.&lt;br /&gt;
&lt;br /&gt;
See [[Saleae Logic16/Firmware]] for more details on the vendor firmware.&lt;br /&gt;
&lt;br /&gt;
== Protocol ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Sample format&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
The samples (as received via USB) for the enabled probes (3, 6, 9, or 16) are organized as follows:&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;&amp;lt;span style=&amp;quot;background-color: yellow&amp;quot;&amp;gt;0xLL 0xLL  0xMM 0xMM  0xNN 0xNN&amp;lt;/span&amp;gt;   &amp;lt;span style=&amp;quot;background-color: cyan&amp;quot;&amp;gt;0xPP 0xPP  0xQQ 0xQQ  0xRR 0xRR&amp;lt;/span&amp;gt; ...&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
In the above example, 3 probes are enabled. For each probe there are 2 bytes / 16 bits (e.g. 0xLL 0xLL for probe 0), then the next probe&amp;#039;s data is received (0xMM 0xMM for probe 1), then 0xNN 0xNN for probe 2. When 2 bytes have been received for all enabled probes, the process restarts with probe 0 again.&lt;br /&gt;
&lt;br /&gt;
The 16 bits of data per probe seem to contain the pin state of the respective probe (1: high, 0: low) at 16 different sampling points/times (which ones depends on the samplerate).&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Configuration&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
Endpoint 1 is used for configuration of the analyzer.  The transfers are &amp;quot;encrypted&amp;quot; using a simple series of additions and XORs.  Two kinds of transfers are used; a 3 byte out transfer starting with 0x81 followed by a 1 byte in transfer, and a 4 byte out transfer starting with 0x80.  It&amp;#039;s quite plausible that these provide raw read/write access to memory locations.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Channel number configuration&lt;br /&gt;
|-&lt;br /&gt;
|3 channels&lt;br /&gt;
|&amp;lt;tt&amp;gt;&amp;lt;span style=&amp;quot;background-color: yellow&amp;quot;&amp;gt;0x80 0x01 0x02 0x07&amp;lt;/span&amp;gt;   &amp;lt;span style=&amp;quot;background-color: cyan&amp;quot;&amp;gt;0x80 0x01 0x03 0x00&amp;lt;/span&amp;gt;&amp;lt;/tt&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
|6 channels&lt;br /&gt;
|&amp;lt;tt&amp;gt;&amp;lt;span style=&amp;quot;background-color: yellow&amp;quot;&amp;gt;0x80 0x01 0x02 0x3f&amp;lt;/span&amp;gt;   &amp;lt;span style=&amp;quot;background-color: cyan&amp;quot;&amp;gt;0x80 0x01 0x03 0x00&amp;lt;/span&amp;gt;&amp;lt;/tt&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
|9 channels&lt;br /&gt;
|&amp;lt;tt&amp;gt;&amp;lt;span style=&amp;quot;background-color: yellow&amp;quot;&amp;gt;0x80 0x01 0x02 0xff&amp;lt;/span&amp;gt;   &amp;lt;span style=&amp;quot;background-color: cyan&amp;quot;&amp;gt;0x80 0x01 0x03 0x01&amp;lt;/span&amp;gt;&amp;lt;/tt&amp;gt; &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Sampling frequency&lt;br /&gt;
|-&lt;br /&gt;
|500 kHz&lt;br /&gt;
|&amp;lt;tt&amp;gt;&amp;lt;span style=&amp;quot;background-color: yellow&amp;quot;&amp;gt;0x80 0x01 0x0a 0x00&amp;lt;/span&amp;gt;   &amp;lt;span style=&amp;quot;background-color: cyan&amp;quot;&amp;gt;0x80 0x01 0x04 0xc7&amp;lt;/span&amp;gt;&amp;lt;/tt&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
|8 MHz&lt;br /&gt;
|&amp;lt;tt&amp;gt;&amp;lt;span style=&amp;quot;background-color: yellow&amp;quot;&amp;gt;0x80 0x01 0x0a 0x01&amp;lt;/span&amp;gt;   &amp;lt;span style=&amp;quot;background-color: cyan&amp;quot;&amp;gt;0x80 0x01 0x04 0x13&amp;lt;/span&amp;gt;&amp;lt;/tt&amp;gt; &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Resources ==&lt;br /&gt;
&lt;br /&gt;
* [http://downloads.saleae.com/Logic+Guide.pdf Manual]&lt;br /&gt;
* [http://www.saleae.com/downloads Vendor software]&lt;br /&gt;
* [http://community.saleae.com/ SDKs]&lt;br /&gt;
&lt;br /&gt;
[[Category:Device]]&lt;br /&gt;
[[Category:Logic analyzer]]&lt;br /&gt;
[[Category:Planned]]&lt;/div&gt;</summary>
		<author><name>Marcus Comstedt</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=Saleae_Logic16&amp;diff=6770</id>
		<title>Saleae Logic16</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=Saleae_Logic16&amp;diff=6770"/>
		<updated>2013-07-23T09:54:03Z</updated>

		<summary type="html">&lt;p&gt;Marcus Comstedt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Saleae Logic16.jpg|thumb|right|Saleae Logic16, front]]&lt;br /&gt;
&lt;br /&gt;
The [http://www.saleae.com/logic16/ Saleae Logic16] is a USB-based, 16-channel logic analyzer with 100/50/25/12.5MHz sampling rate (at 2/4/8/16 enabled channels). &lt;br /&gt;
&lt;br /&gt;
The case requires a &amp;#039;&amp;#039;&amp;#039;Torx T5&amp;#039;&amp;#039;&amp;#039; screwdriver to open.&lt;br /&gt;
&lt;br /&gt;
See [[Saleae Logic16/Info]] for more details (such as &amp;#039;&amp;#039;&amp;#039;lsusb -vvv&amp;#039;&amp;#039;&amp;#039; output) about the device.&lt;br /&gt;
&lt;br /&gt;
See [[Saleae Logic]] for the predecessor product of the Saleae Logic16. &lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.xilinx.com/support/documentation/data_sheets/ds529.pdf Xilinx XC3S200A] 200K gate FPGA&lt;br /&gt;
* Cypress CY7C68013A-56PVXC (FX2LP) USB interface chip&lt;br /&gt;
&lt;br /&gt;
== Photos ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Saleae Logic16.jpg|&amp;lt;small&amp;gt;Device, front&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Saleae Logic16 bottom.jpg|&amp;lt;small&amp;gt;Device, bottom&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Saleae Logic16 PCB top.jpg|&amp;lt;small&amp;gt;PCB, top&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Saleae Logic16 PCB bottom.jpg|&amp;lt;small&amp;gt;PCB, bottom&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Firmware ==&lt;br /&gt;
&lt;br /&gt;
The firmware for the FX2LP is embedded in the vendor application as a set of Intel HEX lines.  Each line is uploaded individually with a separate control transfer.  The firmware currently occupies the address range [0x0000-0x145d], but is uploaded out of order.  &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;TODO&amp;lt;/span&amp;gt;: Make a tool to extract the firmware from the application binary.&lt;br /&gt;
&lt;br /&gt;
See [[Saleae Logic16/Firmware]] for more details on the vendor firmware.&lt;br /&gt;
&lt;br /&gt;
== Protocol ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Sample format&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
The samples (as received via USB) for the enabled probes (3, 6, 9, or 16) are organized as follows:&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;&amp;lt;span style=&amp;quot;background-color: yellow&amp;quot;&amp;gt;0xLL 0xLL  0xMM 0xMM  0xNN 0xNN&amp;lt;/span&amp;gt;   &amp;lt;span style=&amp;quot;background-color: cyan&amp;quot;&amp;gt;0xPP 0xPP  0xQQ 0xQQ  0xRR 0xRR&amp;lt;/span&amp;gt; ...&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
In the above example, 3 probes are enabled. For each probe there are 2 bytes / 16 bits (e.g. 0xLL 0xLL for probe 0), then the next probe&amp;#039;s data is received (0xMM 0xMM for probe 1), then 0xNN 0xNN for probe 2. When 2 bytes have been received for all enabled probes, the process restarts with probe 0 again.&lt;br /&gt;
&lt;br /&gt;
The 16 bits of data per probe seem to contain the pin state of the respective probe (1: high, 0: low) at 16 different sampling points/times (which ones depends on the samplerate).&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Configuration&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
Endpoint 1 is used for configuration of the analyzer.  Two kinds of transfers are used; a 3 byte out transfer starting with 0x55 followed by a 1 byte in transfer, and a 4 byte out transfer starting with 0x5a.  It&amp;#039;s quite plausible that these provide raw read/write access to memory locations.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Channel number configuration&lt;br /&gt;
|-&lt;br /&gt;
|3 channels&lt;br /&gt;
|&amp;lt;span style=&amp;quot;background-color: yellow&amp;quot;&amp;gt;0x5a 0x32 0xf4 0x38&amp;lt;/span&amp;gt;   &amp;lt;span style=&amp;quot;background-color: cyan&amp;quot;&amp;gt;0x5a 0x32 0xef 0x1b&amp;lt;/span&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
|6 channels&lt;br /&gt;
|&amp;lt;span style=&amp;quot;background-color: yellow&amp;quot;&amp;gt;0x5a 0x32 0xf4 0xc0&amp;lt;/span&amp;gt;   &amp;lt;span style=&amp;quot;background-color: cyan&amp;quot;&amp;gt;0x5a 0x32 0xef 0x1b&amp;lt;/span&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
|9 channels&lt;br /&gt;
|&amp;lt;span style=&amp;quot;background-color: yellow&amp;quot;&amp;gt;0x5a 0x32 0xf4 0x80&amp;lt;/span&amp;gt;   &amp;lt;span style=&amp;quot;background-color: cyan&amp;quot;&amp;gt;0x5a 0x32 0xef 0xc8&amp;lt;/span&amp;gt; &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Sampling frequency&lt;br /&gt;
|-&lt;br /&gt;
|500 kHz&lt;br /&gt;
|&amp;lt;span style=&amp;quot;background-color: yellow&amp;quot;&amp;gt;0x5a 0x32 0x4c 0x61&amp;lt;/span&amp;gt;   &amp;lt;span style=&amp;quot;background-color: cyan&amp;quot;&amp;gt;0x5a 0x32 0x82 0xb0&amp;lt;/span&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
|8 MHz&lt;br /&gt;
|&amp;lt;span style=&amp;quot;background-color: yellow&amp;quot;&amp;gt;0x5a 0x32 0x4c 0x5e&amp;lt;/span&amp;gt;   &amp;lt;span style=&amp;quot;background-color: cyan&amp;quot;&amp;gt;0x5a 0x32 0x82 0x0c&amp;lt;/span&amp;gt; &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Resources ==&lt;br /&gt;
&lt;br /&gt;
* [http://downloads.saleae.com/Logic+Guide.pdf Manual]&lt;br /&gt;
* [http://www.saleae.com/downloads Vendor software]&lt;br /&gt;
* [http://community.saleae.com/ SDKs]&lt;br /&gt;
&lt;br /&gt;
[[Category:Device]]&lt;br /&gt;
[[Category:Logic analyzer]]&lt;br /&gt;
[[Category:Planned]]&lt;/div&gt;</summary>
		<author><name>Marcus Comstedt</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=Saleae_Logic16/Firmware&amp;diff=6769</id>
		<title>Saleae Logic16/Firmware</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=Saleae_Logic16/Firmware&amp;diff=6769"/>
		<updated>2013-07-23T09:48:42Z</updated>

		<summary type="html">&lt;p&gt;Marcus Comstedt: Created page with &amp;quot;The following information is related to the vendor firmware included with the version 1.1.15 of the vendor application &amp;quot;Logic&amp;quot;. == Interrupt handlers == The following interrup...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The following information is related to the vendor firmware included with the&lt;br /&gt;
version 1.1.15 of the vendor application &amp;quot;Logic&amp;quot;.&lt;br /&gt;
== Interrupt handlers ==&lt;br /&gt;
The following interrupt handlers are installed.  If the address is absent, it means the handler just returns (RETI) without performing any action.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|RESET&lt;br /&gt;
|0x0000&lt;br /&gt;
|-&lt;br /&gt;
|TF2&lt;br /&gt;
|0x0e65&lt;br /&gt;
|-&lt;br /&gt;
|RESUME&lt;br /&gt;
|0x002e&lt;br /&gt;
|-&lt;br /&gt;
|SUDAV&lt;br /&gt;
|0x0ae8&lt;br /&gt;
|-&lt;br /&gt;
|SOF&lt;br /&gt;
|0x13d2&lt;br /&gt;
|-&lt;br /&gt;
|SUTOK&lt;br /&gt;
|0x13bf&lt;br /&gt;
|-&lt;br /&gt;
|SUSPEND&lt;br /&gt;
|0x13aa&lt;br /&gt;
|-&lt;br /&gt;
|USB_RESET&lt;br /&gt;
|0x130b&lt;br /&gt;
|-&lt;br /&gt;
|HISPEED&lt;br /&gt;
|0x12df&lt;br /&gt;
|-&lt;br /&gt;
|EP0ACK&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP0_IN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP0_OUT&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP1_IN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP1_OUT&lt;br /&gt;
|0x115d&lt;br /&gt;
|-&lt;br /&gt;
|EP2&lt;br /&gt;
|0x11a2&lt;br /&gt;
|-&lt;br /&gt;
|EP4&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|IBN&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP0PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP1PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8PING&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|ERRLIMIT&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2ISOERR&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4ISOERRF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6ISOERR&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8ISOERRF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8PF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP4EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8EF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP2FF&lt;br /&gt;
|0x11e7&lt;br /&gt;
|-&lt;br /&gt;
|EP4FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP6FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|EP8FF&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|GPIFDONE&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|GPIFWF&lt;br /&gt;
|&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Marcus Comstedt</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=Saleae_Logic16&amp;diff=6768</id>
		<title>Saleae Logic16</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=Saleae_Logic16&amp;diff=6768"/>
		<updated>2013-07-22T14:24:53Z</updated>

		<summary type="html">&lt;p&gt;Marcus Comstedt: Some notes on configuration transfers on EP1&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Saleae Logic16.jpg|thumb|right|Saleae Logic16, front]]&lt;br /&gt;
&lt;br /&gt;
The [http://www.saleae.com/logic16/ Saleae Logic16] is a USB-based, 16-channel logic analyzer with 100/50/25/12.5MHz sampling rate (at 2/4/8/16 enabled channels). &lt;br /&gt;
&lt;br /&gt;
The case requires a &amp;#039;&amp;#039;&amp;#039;Torx T5&amp;#039;&amp;#039;&amp;#039; screwdriver to open.&lt;br /&gt;
&lt;br /&gt;
See [[Saleae Logic16/Info]] for more details (such as &amp;#039;&amp;#039;&amp;#039;lsusb -vvv&amp;#039;&amp;#039;&amp;#039; output) about the device.&lt;br /&gt;
&lt;br /&gt;
See [[Saleae Logic]] for the predecessor product of the Saleae Logic16. &lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.xilinx.com/support/documentation/data_sheets/ds529.pdf Xilinx XC3S200A] 200K gate FPGA&lt;br /&gt;
* Cypress CY7C68013A-56PVXC (FX2LP) USB interface chip&lt;br /&gt;
&lt;br /&gt;
== Photos ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Saleae Logic16.jpg|&amp;lt;small&amp;gt;Device, front&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Saleae Logic16 bottom.jpg|&amp;lt;small&amp;gt;Device, bottom&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Saleae Logic16 PCB top.jpg|&amp;lt;small&amp;gt;PCB, top&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Saleae Logic16 PCB bottom.jpg|&amp;lt;small&amp;gt;PCB, bottom&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Firmware ==&lt;br /&gt;
&lt;br /&gt;
The firmware for the FX2LP is embedded in the vendor application as a set of Intel HEX lines.  Each line is uploaded individually with a separate control transfer.  The firmware currently occupies the address range [0x0000-0x145d], but is uploaded out of order.  &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;TODO&amp;lt;/span&amp;gt;: Make a tool to extract the firmware from the application binary.&lt;br /&gt;
&lt;br /&gt;
== Protocol ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Sample format&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
The samples (as received via USB) for the enabled probes (3, 6, 9, or 16) are organized as follows:&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;&amp;lt;span style=&amp;quot;background-color: yellow&amp;quot;&amp;gt;0xLL 0xLL  0xMM 0xMM  0xNN 0xNN&amp;lt;/span&amp;gt;   &amp;lt;span style=&amp;quot;background-color: cyan&amp;quot;&amp;gt;0xPP 0xPP  0xQQ 0xQQ  0xRR 0xRR&amp;lt;/span&amp;gt; ...&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
In the above example, 3 probes are enabled. For each probe there are 2 bytes / 16 bits (e.g. 0xLL 0xLL for probe 0), then the next probe&amp;#039;s data is received (0xMM 0xMM for probe 1), then 0xNN 0xNN for probe 2. When 2 bytes have been received for all enabled probes, the process restarts with probe 0 again.&lt;br /&gt;
&lt;br /&gt;
The 16 bits of data per probe seem to contain the pin state of the respective probe (1: high, 0: low) at 16 different sampling points/times (which ones depends on the samplerate).&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Configuration&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
Endpoint 1 is used for configuration of the analyzer.  Two kinds of transfers are used; a 3 byte out transfer starting with 0x55 followed by a 1 byte in transfer, and a 4 byte out transfer starting with 0x5a.  It&amp;#039;s quite plausible that these provide raw read/write access to memory locations.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Channel number configuration&lt;br /&gt;
|-&lt;br /&gt;
|3 channels&lt;br /&gt;
|&amp;lt;span style=&amp;quot;background-color: yellow&amp;quot;&amp;gt;0x5a 0x32 0xf4 0x38&amp;lt;/span&amp;gt;   &amp;lt;span style=&amp;quot;background-color: cyan&amp;quot;&amp;gt;0x5a 0x32 0xef 0x1b&amp;lt;/span&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
|6 channels&lt;br /&gt;
|&amp;lt;span style=&amp;quot;background-color: yellow&amp;quot;&amp;gt;0x5a 0x32 0xf4 0xc0&amp;lt;/span&amp;gt;   &amp;lt;span style=&amp;quot;background-color: cyan&amp;quot;&amp;gt;0x5a 0x32 0xef 0x1b&amp;lt;/span&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
|9 channels&lt;br /&gt;
|&amp;lt;span style=&amp;quot;background-color: yellow&amp;quot;&amp;gt;0x5a 0x32 0xf4 0x80&amp;lt;/span&amp;gt;   &amp;lt;span style=&amp;quot;background-color: cyan&amp;quot;&amp;gt;0x5a 0x32 0xef 0xc8&amp;lt;/span&amp;gt; &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Sampling frequency&lt;br /&gt;
|-&lt;br /&gt;
|500 kHz&lt;br /&gt;
|&amp;lt;span style=&amp;quot;background-color: yellow&amp;quot;&amp;gt;0x5a 0x32 0x4c 0x61&amp;lt;/span&amp;gt;   &amp;lt;span style=&amp;quot;background-color: cyan&amp;quot;&amp;gt;0x5a 0x32 0x82 0xb0&amp;lt;/span&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
|8 MHz&lt;br /&gt;
|&amp;lt;span style=&amp;quot;background-color: yellow&amp;quot;&amp;gt;0x5a 0x32 0x4c 0x5e&amp;lt;/span&amp;gt;   &amp;lt;span style=&amp;quot;background-color: cyan&amp;quot;&amp;gt;0x5a 0x32 0x82 0x0c&amp;lt;/span&amp;gt; &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Resources ==&lt;br /&gt;
&lt;br /&gt;
* [http://downloads.saleae.com/Logic+Guide.pdf Manual]&lt;br /&gt;
* [http://www.saleae.com/downloads Vendor software]&lt;br /&gt;
* [http://community.saleae.com/ SDKs]&lt;br /&gt;
&lt;br /&gt;
[[Category:Device]]&lt;br /&gt;
[[Category:Logic analyzer]]&lt;br /&gt;
[[Category:Planned]]&lt;/div&gt;</summary>
		<author><name>Marcus Comstedt</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=Saleae_Logic16&amp;diff=6767</id>
		<title>Saleae Logic16</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=Saleae_Logic16&amp;diff=6767"/>
		<updated>2013-07-21T10:51:53Z</updated>

		<summary type="html">&lt;p&gt;Marcus Comstedt: Some notes on the firmware&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Saleae Logic16.jpg|thumb|right|Saleae Logic16, front]]&lt;br /&gt;
&lt;br /&gt;
The [http://www.saleae.com/logic16/ Saleae Logic16] is a USB-based, 16-channel logic analyzer with 100/50/25/12.5MHz sampling rate (at 2/4/8/16 enabled channels). &lt;br /&gt;
&lt;br /&gt;
The case requires a &amp;#039;&amp;#039;&amp;#039;Torx T5&amp;#039;&amp;#039;&amp;#039; screwdriver to open.&lt;br /&gt;
&lt;br /&gt;
See [[Saleae Logic16/Info]] for more details (such as &amp;#039;&amp;#039;&amp;#039;lsusb -vvv&amp;#039;&amp;#039;&amp;#039; output) about the device.&lt;br /&gt;
&lt;br /&gt;
See [[Saleae Logic]] for the predecessor product of the Saleae Logic16. &lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.xilinx.com/support/documentation/data_sheets/ds529.pdf Xilinx XC3S200A] 200K gate FPGA&lt;br /&gt;
* Cypress CY7C68013A-56PVXC (FX2LP) USB interface chip&lt;br /&gt;
&lt;br /&gt;
== Photos ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Saleae Logic16.jpg|&amp;lt;small&amp;gt;Device, front&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Saleae Logic16 bottom.jpg|&amp;lt;small&amp;gt;Device, bottom&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Saleae Logic16 PCB top.jpg|&amp;lt;small&amp;gt;PCB, top&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Saleae Logic16 PCB bottom.jpg|&amp;lt;small&amp;gt;PCB, bottom&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Firmware ==&lt;br /&gt;
&lt;br /&gt;
The firmware for the FX2LP is embedded in the vendor application as a set of Intel HEX lines.  Each line is uploaded individually with a separate control transfer.  The firmware currently occupies the address range [0x0000-0x145d], but is uploaded out of order.  &amp;lt;span style=&amp;quot;color: red&amp;quot;&amp;gt;TODO&amp;lt;/span&amp;gt;: Make a tool to extract the firmware from the application binary.&lt;br /&gt;
&lt;br /&gt;
== Protocol ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Sample format&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
The samples (as received via USB) for the enabled probes (3, 6, 9, or 16) are organized as follows:&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;&amp;lt;span style=&amp;quot;background-color: yellow&amp;quot;&amp;gt;0xLL 0xLL  0xMM 0xMM  0xNN 0xNN&amp;lt;/span&amp;gt;   &amp;lt;span style=&amp;quot;background-color: cyan&amp;quot;&amp;gt;0xPP 0xPP  0xQQ 0xQQ  0xRR 0xRR&amp;lt;/span&amp;gt; ...&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
In the above example, 3 probes are enabled. For each probe there are 2 bytes / 16 bits (e.g. 0xLL 0xLL for probe 0), then the next probe&amp;#039;s data is received (0xMM 0xMM for probe 1), then 0xNN 0xNN for probe 2. When 2 bytes have been received for all enabled probes, the process restarts with probe 0 again.&lt;br /&gt;
&lt;br /&gt;
The 16 bits of data per probe seem to contain the pin state of the respective probe (1: high, 0: low) at 16 different sampling points/times (which ones depends on the samplerate).&lt;br /&gt;
&lt;br /&gt;
== Resources ==&lt;br /&gt;
&lt;br /&gt;
* [http://downloads.saleae.com/Logic+Guide.pdf Manual]&lt;br /&gt;
* [http://www.saleae.com/downloads Vendor software]&lt;br /&gt;
* [http://community.saleae.com/ SDKs]&lt;br /&gt;
&lt;br /&gt;
[[Category:Device]]&lt;br /&gt;
[[Category:Logic analyzer]]&lt;br /&gt;
[[Category:Planned]]&lt;/div&gt;</summary>
		<author><name>Marcus Comstedt</name></author>
	</entry>
</feed>