<?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=Endolith</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=Endolith"/>
	<link rel="alternate" type="text/html" href="https://sigrok.org/wiki/Special:Contributions/Endolith"/>
	<updated>2026-05-09T04:56:49Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.37.1</generator>
	<entry>
		<id>https://sigrok.org/w/index.php?title=Saleae_Logic16&amp;diff=16510</id>
		<title>Saleae Logic16</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=Saleae_Logic16&amp;diff=16510"/>
		<updated>2023-05-23T21:03:13Z</updated>

		<summary type="html">&lt;p&gt;Endolith: /* Firmware */ Got it working on all three OSes!&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 -v&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/file/138911/download 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;N-MOSFET&amp;#039;&amp;#039;&amp;#039;: 2x 2N7002 type MOSFET (marking: &amp;quot;72Y7&amp;quot;). Connected as &amp;quot;low-side&amp;quot; switch/LED driver and inverter.&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;N-MOSFETs&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;
To use the Saleae Logic16 (or its clones) with sigrok, you must first use a Python script to extract the FX2 firmware and the FPGA bitstreams from version 1.2.10 of Saleae&amp;#039;s &amp;#039;&amp;#039;Logic&amp;#039;&amp;#039; software.&lt;br /&gt;
&lt;br /&gt;
First download the Saleae vendor software.  This version has been tested to work, but more recent versions are not supported currently (see [https://sigrok.org/bugzilla/show_bug.cgi?id=989 bug #989]).  Old Saleae vendor software versions can be downloaded from [https://support.saleae.com/logic-software/legacy-software/older-software-releases support.saleae.com].  (32-bit vs 64-bit download doesn&amp;#039;t matter; both produce the same output.)&lt;br /&gt;
&lt;br /&gt;
Then extract the &amp;lt;code&amp;gt;Logic&amp;lt;/code&amp;gt; Linux binary from the zip file and use the [http://sigrok.org/gitweb/?p=sigrok-util.git;a=tree;f=firmware/saleae-logic16 sigrok-fwextract-saleae-logic16] tool to extract the files from it.  On Windows, [https://github.com/anno73/Saleae-Logic16-Clone/wiki#extract-from-logic this Python script can be run from python.exe].  On Linux, it can be executed directly:&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 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;
On Linux, [https://sigrok.org/bugzilla/show_bug.cgi?id=67 this is usually] &amp;lt;code&amp;gt;/usr/local/share/sigrok-firmware&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;/usr/share/sigrok-firmware&amp;lt;/code&amp;gt;.  The latter is correct on Ubuntu (and where files are created by the unrelated [https://packages.ubuntu.com/lunar/all/sigrok-firmware-fx2lafw/filelist &amp;lt;code&amp;gt;sigrok-firmware-fx2lafw&amp;lt;/code&amp;gt; package]).  &lt;br /&gt;
&lt;br /&gt;
On Windows, they should be placed in &amp;lt;code&amp;gt;C:\Program Files\sigrok\PulseView\share\sigrok-firmware\&amp;lt;/code&amp;gt;.  &lt;br /&gt;
&lt;br /&gt;
On macOS, they should be placed in &amp;lt;code&amp;gt;/[…]/PulseView.app/Contents/share/sigrok-firmware/&amp;lt;/code&amp;gt;.&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;
== Driver ==&lt;br /&gt;
In Windows, the [https://github.com/anno73/Saleae-Logic16-Clone/wiki#install-usb-driver USB driver must also be installed using Zadig], similar to other devices, or you will get &amp;lt;code&amp;gt;sr: saleae-logic16: Failed to init device.&amp;lt;/code&amp;gt;&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 (current release)]&lt;br /&gt;
** [https://support.saleae.com/logic-software/latest-beta-release Vendor software (beta releases)]&lt;br /&gt;
** [https://support.saleae.com/logic-software/legacy-software/older-software-releases Vendor software (older releases)]&lt;br /&gt;
* [https://support.saleae.com/saleae-api-and-sdk/what-apis-are-available 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>Endolith</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=Saleae_Logic16&amp;diff=16509</id>
		<title>Saleae Logic16</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=Saleae_Logic16&amp;diff=16509"/>
		<updated>2023-05-23T20:37:31Z</updated>

		<summary type="html">&lt;p&gt;Endolith: /* Protocol */ Finally got it working&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 -v&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/file/138911/download 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;N-MOSFET&amp;#039;&amp;#039;&amp;#039;: 2x 2N7002 type MOSFET (marking: &amp;quot;72Y7&amp;quot;). Connected as &amp;quot;low-side&amp;quot; switch/LED driver and inverter.&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;N-MOSFETs&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;
To use the Saleae Logic16 (or its clones) with sigrok, you must first use a Python script to extract the FX2 firmware and the FPGA bitstreams from version 1.2.10 of Saleae&amp;#039;s &amp;#039;&amp;#039;Logic&amp;#039;&amp;#039; software.&lt;br /&gt;
&lt;br /&gt;
First download the Saleae vendor software.  This version has been tested to work, but more recent versions are not supported currently (see [https://sigrok.org/bugzilla/show_bug.cgi?id=989 bug #989]).  Old Saleae vendor software versions can be downloaded from [https://support.saleae.com/logic-software/legacy-software/older-software-releases support.saleae.com].  (32-bit vs 64-bit download doesn&amp;#039;t matter; both produce the same output.)&lt;br /&gt;
&lt;br /&gt;
Then extract the &amp;lt;code&amp;gt;Logic&amp;lt;/code&amp;gt; Linux binary from the zip file and use the [http://sigrok.org/gitweb/?p=sigrok-util.git;a=tree;f=firmware/saleae-logic16 sigrok-fwextract-saleae-logic16] tool to extract the files from it.  On Windows, [https://github.com/anno73/Saleae-Logic16-Clone/wiki#extract-from-logic this Python script can be run from python.exe].  On Linux, it can be executed directly:&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 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.  [https://sigrok.org/bugzilla/show_bug.cgi?id=67 This is usually] &amp;lt;code&amp;gt;/usr/local/share/sigrok-firmware&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;/usr/share/sigrok-firmware&amp;lt;/code&amp;gt;.  The latter is correct on Ubuntu (and where files are created by the unrelated [https://packages.ubuntu.com/lunar/all/sigrok-firmware-fx2lafw/filelist &amp;lt;code&amp;gt;sigrok-firmware-fx2lafw&amp;lt;/code&amp;gt; package]).  On Windows, they should be placed in &amp;lt;code&amp;gt;C:\Program Files\sigrok\PulseView\share\sigrok-firmware\&amp;lt;/code&amp;gt;.&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;
== Driver ==&lt;br /&gt;
In Windows, the [https://github.com/anno73/Saleae-Logic16-Clone/wiki#install-usb-driver USB driver must also be installed using Zadig], similar to other devices, or you will get &amp;lt;code&amp;gt;sr: saleae-logic16: Failed to init device.&amp;lt;/code&amp;gt;&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 (current release)]&lt;br /&gt;
** [https://support.saleae.com/logic-software/latest-beta-release Vendor software (beta releases)]&lt;br /&gt;
** [https://support.saleae.com/logic-software/legacy-software/older-software-releases Vendor software (older releases)]&lt;br /&gt;
* [https://support.saleae.com/saleae-api-and-sdk/what-apis-are-available 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>Endolith</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=Saleae_Logic16&amp;diff=16508</id>
		<title>Saleae Logic16</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=Saleae_Logic16&amp;diff=16508"/>
		<updated>2023-05-23T20:34:26Z</updated>

		<summary type="html">&lt;p&gt;Endolith: /* Firmware */ Oh it&amp;#039;s Python without .py extension, so actually cross-platform.&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 -v&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/file/138911/download 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;N-MOSFET&amp;#039;&amp;#039;&amp;#039;: 2x 2N7002 type MOSFET (marking: &amp;quot;72Y7&amp;quot;). Connected as &amp;quot;low-side&amp;quot; switch/LED driver and inverter.&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;N-MOSFETs&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;
To use the Saleae Logic16 (or its clones) with sigrok, you must first use a Python script to extract the FX2 firmware and the FPGA bitstreams from version 1.2.10 of Saleae&amp;#039;s &amp;#039;&amp;#039;Logic&amp;#039;&amp;#039; software.&lt;br /&gt;
&lt;br /&gt;
First download the Saleae vendor software.  This version has been tested to work, but more recent versions are not supported currently (see [https://sigrok.org/bugzilla/show_bug.cgi?id=989 bug #989]).  Old Saleae vendor software versions can be downloaded from [https://support.saleae.com/logic-software/legacy-software/older-software-releases support.saleae.com].  (32-bit vs 64-bit download doesn&amp;#039;t matter; both produce the same output.)&lt;br /&gt;
&lt;br /&gt;
Then extract the &amp;lt;code&amp;gt;Logic&amp;lt;/code&amp;gt; Linux binary from the zip file and use the [http://sigrok.org/gitweb/?p=sigrok-util.git;a=tree;f=firmware/saleae-logic16 sigrok-fwextract-saleae-logic16] tool to extract the files from it.  On Windows, [https://github.com/anno73/Saleae-Logic16-Clone/wiki#extract-from-logic this Python script can be run from python.exe].  On Linux, it can be executed directly:&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 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.  [https://sigrok.org/bugzilla/show_bug.cgi?id=67 This is usually] &amp;lt;code&amp;gt;/usr/local/share/sigrok-firmware&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;/usr/share/sigrok-firmware&amp;lt;/code&amp;gt;.  The latter is correct on Ubuntu (and where files are created by the unrelated [https://packages.ubuntu.com/lunar/all/sigrok-firmware-fx2lafw/filelist &amp;lt;code&amp;gt;sigrok-firmware-fx2lafw&amp;lt;/code&amp;gt; package]).  On Windows, they should be placed in &amp;lt;code&amp;gt;C:\Program Files\sigrok\PulseView\share\sigrok-firmware\&amp;lt;/code&amp;gt;.&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 (current release)]&lt;br /&gt;
** [https://support.saleae.com/logic-software/latest-beta-release Vendor software (beta releases)]&lt;br /&gt;
** [https://support.saleae.com/logic-software/legacy-software/older-software-releases Vendor software (older releases)]&lt;br /&gt;
* [https://support.saleae.com/saleae-api-and-sdk/what-apis-are-available 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>Endolith</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=Saleae_Logic16&amp;diff=16507</id>
		<title>Saleae Logic16</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=Saleae_Logic16&amp;diff=16507"/>
		<updated>2023-05-23T19:42:08Z</updated>

		<summary type="html">&lt;p&gt;Endolith: /* Firmware */ Trying to make instructions more less confusing, putting information in order, adding details&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 -v&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/file/138911/download 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;N-MOSFET&amp;#039;&amp;#039;&amp;#039;: 2x 2N7002 type MOSFET (marking: &amp;quot;72Y7&amp;quot;). Connected as &amp;quot;low-side&amp;quot; switch/LED driver and inverter.&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;N-MOSFETs&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;
To use the Saleae Logic16 (or its clones) with sigrok, you must first use a Linux machine to extract the FX2 firmware and the FPGA bitstreams from version 1.2.10 of Saleae&amp;#039;s &amp;#039;&amp;#039;Logic&amp;#039;&amp;#039; software.&lt;br /&gt;
&lt;br /&gt;
First download the Saleae vendor software.  This version has been tested to work, but more recent versions are not supported currently (see [https://sigrok.org/bugzilla/show_bug.cgi?id=989 bug #989]).  Old Saleae vendor software versions can be downloaded from [https://support.saleae.com/logic-software/legacy-software/older-software-releases support.saleae.com].  (32-bit vs 64-bit download doesn&amp;#039;t matter; both produce the same output.)&lt;br /&gt;
&lt;br /&gt;
Then extract the &amp;lt;code&amp;gt;Logic&amp;lt;/code&amp;gt; Linux binary from the zip file and use the [http://sigrok.org/gitweb/?p=sigrok-util.git;a=tree;f=firmware/saleae-logic16 sigrok-fwextract-saleae-logic16] tool to extract the files from it:&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 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.  [https://sigrok.org/bugzilla/show_bug.cgi?id=67 This is usually] &amp;lt;code&amp;gt;/usr/local/share/sigrok-firmware&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;/usr/share/sigrok-firmware&amp;lt;/code&amp;gt;.  The latter is correct on Ubuntu (and where files are created by the unrelated [https://packages.ubuntu.com/lunar/all/sigrok-firmware-fx2lafw/filelist &amp;lt;code&amp;gt;sigrok-firmware-fx2lafw&amp;lt;/code&amp;gt; package]).&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 (current release)]&lt;br /&gt;
** [https://support.saleae.com/logic-software/latest-beta-release Vendor software (beta releases)]&lt;br /&gt;
** [https://support.saleae.com/logic-software/legacy-software/older-software-releases Vendor software (older releases)]&lt;br /&gt;
* [https://support.saleae.com/saleae-api-and-sdk/what-apis-are-available 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>Endolith</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=Talk:Protocol_decoder_output&amp;diff=16289</id>
		<title>Talk:Protocol decoder output</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=Talk:Protocol_decoder_output&amp;diff=16289"/>
		<updated>2022-04-06T19:02:20Z</updated>

		<summary type="html">&lt;p&gt;Endolith: Where does the report show up?&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Where does the report show up?  I have never seen one. [[User:Endolith|Endolith]] ([[User talk:Endolith|talk]]) 21:02, 6 April 2022 (CEST)&lt;/div&gt;</summary>
		<author><name>Endolith</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=Libsigrokdecode&amp;diff=16246</id>
		<title>Libsigrokdecode</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=Libsigrokdecode&amp;diff=16246"/>
		<updated>2022-01-18T22:35:31Z</updated>

		<summary type="html">&lt;p&gt;Endolith: Python version is old, so no underscores in literals, f-strings, etc.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:libsigrokdecode}}&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;libsigrokdecode&amp;#039;&amp;#039;&amp;#039; (sometimes abbreviated as &amp;quot;srd&amp;quot;) is a shared library written in C, which provides (streaming) protocol decoding functionality.&lt;br /&gt;
&lt;br /&gt;
It is licensed under the terms of the &amp;#039;&amp;#039;&amp;#039;GNU GPL, version 3 or later&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
The [[protocol decoders]] are written in Python 3 (&amp;gt;=3.2, &amp;lt;3.6).&lt;br /&gt;
&lt;br /&gt;
== Getting the code ==&lt;br /&gt;
&lt;br /&gt;
 $ &amp;#039;&amp;#039;&amp;#039;git clone git://sigrok.org/libsigrokdecode&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
You can also [http://sigrok.org/gitweb/?p=libsigrokdecode.git;a=tree browse the source code] via gitweb.&lt;br /&gt;
&lt;br /&gt;
== Distribution packages ==&lt;br /&gt;
&lt;br /&gt;
See [[Downloads#Binaries_and_distribution_packages|Downloads]].&lt;br /&gt;
&lt;br /&gt;
== Building from source ==&lt;br /&gt;
&lt;br /&gt;
See [[Building]].&lt;br /&gt;
&lt;br /&gt;
== Supported protocol decoders ==&lt;br /&gt;
&lt;br /&gt;
The libsigrokdecode library ships with a collection of various protocol decoders out of the box (but you can write your own too, of course; see [[Protocol decoder HOWTO]] and [[Protocol decoder API]] for details).&lt;br /&gt;
&lt;br /&gt;
See [[Protocol decoders]] for the list of currently supported ones (and others we might support in the future).&lt;br /&gt;
&lt;br /&gt;
== Resources ==&lt;br /&gt;
&lt;br /&gt;
* [http://sigrok.org/api/libsigrokdecode/unstable/index.html API documentation]&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;/div&gt;</summary>
		<author><name>Endolith</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=Protocol_decoder_HOWTO&amp;diff=16132</id>
		<title>Protocol decoder HOWTO</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=Protocol_decoder_HOWTO&amp;diff=16132"/>
		<updated>2021-07-19T14:05:12Z</updated>

		<summary type="html">&lt;p&gt;Endolith: /* Random notes, tips and tricks */ Mention srdhelper, which maybe makes some of this obsolete?&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page serves as a quick-start guide for people who want to write their own [[libsigrokdecode]] protocol decoders ([[Protocol decoders|PDs]]).&lt;br /&gt;
&lt;br /&gt;
It is &amp;#039;&amp;#039;&amp;#039;not&amp;#039;&amp;#039;&amp;#039; intended to replace the [[Protocol decoder API]] page, but rather to give a short overview/tutorial and some tips.&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Protocol decoders are written entirely in Python (&amp;gt;= 3.0).&lt;br /&gt;
&lt;br /&gt;
== Files ==&lt;br /&gt;
&lt;br /&gt;
Every protocol decoder is a Python module and has its own subdirectory in libsigrokdecode&amp;#039;s &amp;#039;&amp;#039;&amp;#039;[http://sigrok.org/gitweb/?p=libsigrokdecode.git;a=tree;f=decoders decoders]&amp;#039;&amp;#039;&amp;#039; directory.&lt;br /&gt;
&lt;br /&gt;
This is a minimalistic example of how a protocol decoder looks like, in this case the &amp;#039;&amp;#039;&amp;#039;[[Protocol_decoder:I2c|i2c]]&amp;#039;&amp;#039;&amp;#039; decoder (license header, comments, and some other parts omitted).&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Note&amp;#039;&amp;#039;&amp;#039;: Do not start new protocol decoders by copying code from here. Instead, it&amp;#039;s recommended to select an already existing decoder in the source code which is similar to the one you plan to write, and copy that as a starting point.&lt;br /&gt;
&lt;br /&gt;
=== __init__.py ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 I²C (Inter-Integrated Circuit) is a bidirectional, multi-master&lt;br /&gt;
 bus using two signals (SCL = serial clock line, SDA = serial data line).&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;Insert notes and hints for the user here&amp;gt;&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 &lt;br /&gt;
 from .pd import Decoder&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is a standard Python file, required in every Python module. It contains a module-level docstring, which is accessible by frontends via the [http://sigrok.org/api/libsigrokdecode/unstable/index.html libsigrokdecode API]. It should contain a (very) short description of what the protocol (in this case [[Protocol_decoder:I2c|I²C]]) is about, and some notes and hints for the user of this protocol decoder (which can be shown in GUIs when the user selects/browses different PDs).&lt;br /&gt;
&lt;br /&gt;
This docstring should &amp;#039;&amp;#039;&amp;#039;not&amp;#039;&amp;#039;&amp;#039; contain the full, extensive protocol description. Instead, the per-PD wiki page should be used for protocol description, photos of devices or photos of example acquisition setups, and so on. Each decoder has one unique wiki page at the URL &amp;#039;&amp;#039;&amp;#039;&amp;lt;nowiki&amp;gt;http://sigrok.org/wiki/Protocol_decoder:&amp;lt;pd&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;#039;&amp;#039;&amp;#039;, where &amp;#039;&amp;#039;&amp;#039;&amp;lt;pd&amp;gt;&amp;#039;&amp;#039;&amp;#039; is the Python module name of the decoder (&amp;#039;&amp;#039;&amp;#039;i2c&amp;#039;&amp;#039;&amp;#039; in this case). Some examples for such per-PD wiki pages: [[Protocol_decoder:Uart|UART]], [[Protocol_decoder:Pan1321|PAN1321]], [[Protocol_decoder:Mx25lxx05d|MX25Lxx05D]], [[Protocol_decoder:Dcf77|DCF77]].&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;&amp;#039;&amp;#039;&amp;#039;from .pd import Decoder&amp;#039;&amp;#039;&amp;#039;&amp;quot; line will make sure the code from &amp;#039;&amp;#039;&amp;#039;pd.py&amp;#039;&amp;#039;&amp;#039; gets properly imported when this module is used.&lt;br /&gt;
&lt;br /&gt;
=== pd.py ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
 import sigrokdecode as srd&lt;br /&gt;
 &lt;br /&gt;
 class Decoder(srd.Decoder):&lt;br /&gt;
     api_version = 2&lt;br /&gt;
     id = &amp;#039;i2c&amp;#039;&lt;br /&gt;
     name = &amp;#039;I²C&amp;#039;&lt;br /&gt;
     longname = &amp;#039;Inter-Integrated Circuit&amp;#039;&lt;br /&gt;
     desc = &amp;#039;Two-wire, multi-master, serial bus.&amp;#039;&lt;br /&gt;
     license = &amp;#039;gplv2+&amp;#039;&lt;br /&gt;
     inputs = [&amp;#039;logic&amp;#039;]&lt;br /&gt;
     outputs = [&amp;#039;i2c&amp;#039;]&lt;br /&gt;
     channels = (&lt;br /&gt;
         {&amp;#039;id&amp;#039;: &amp;#039;scl&amp;#039;, &amp;#039;name&amp;#039;: &amp;#039;SCL&amp;#039;, &amp;#039;desc&amp;#039;: &amp;#039;Serial clock line&amp;#039;},&lt;br /&gt;
         {&amp;#039;id&amp;#039;: &amp;#039;sda&amp;#039;, &amp;#039;name&amp;#039;: &amp;#039;SDA&amp;#039;, &amp;#039;desc&amp;#039;: &amp;#039;Serial data line&amp;#039;},&lt;br /&gt;
     )&lt;br /&gt;
     optional_channels = ()&lt;br /&gt;
     options = (&lt;br /&gt;
         {&amp;#039;id&amp;#039;: &amp;#039;address_format&amp;#039;, &amp;#039;desc&amp;#039;: &amp;#039;Displayed slave address format&amp;#039;,&lt;br /&gt;
            &amp;#039;default&amp;#039;: &amp;#039;shifted&amp;#039;, &amp;#039;values&amp;#039;: (&amp;#039;shifted&amp;#039;, &amp;#039;unshifted&amp;#039;)},&lt;br /&gt;
     )&lt;br /&gt;
     annotations = (&lt;br /&gt;
         (&amp;#039;start&amp;#039;, &amp;#039;Start condition&amp;#039;),&lt;br /&gt;
         (&amp;#039;repeat-start&amp;#039;, &amp;#039;Repeat start condition&amp;#039;),&lt;br /&gt;
         (&amp;#039;stop&amp;#039;, &amp;#039;Stop condition&amp;#039;),&lt;br /&gt;
         (&amp;#039;ack&amp;#039;, &amp;#039;ACK&amp;#039;),&lt;br /&gt;
         (&amp;#039;nack&amp;#039;, &amp;#039;NACK&amp;#039;),&lt;br /&gt;
         (&amp;#039;bit&amp;#039;, &amp;#039;Data/address bit&amp;#039;),&lt;br /&gt;
         (&amp;#039;address-read&amp;#039;, &amp;#039;Address read&amp;#039;),&lt;br /&gt;
         (&amp;#039;address-write&amp;#039;, &amp;#039;Address write&amp;#039;),&lt;br /&gt;
         (&amp;#039;data-read&amp;#039;, &amp;#039;Data read&amp;#039;),&lt;br /&gt;
         (&amp;#039;data-write&amp;#039;, &amp;#039;Data write&amp;#039;),&lt;br /&gt;
         (&amp;#039;warnings&amp;#039;, &amp;#039;Human-readable warnings&amp;#039;),&lt;br /&gt;
     )&lt;br /&gt;
     annotation_rows = (&lt;br /&gt;
         (&amp;#039;bits&amp;#039;, &amp;#039;Bits&amp;#039;, (5,)),&lt;br /&gt;
         (&amp;#039;addr-data&amp;#039;, &amp;#039;Address/Data&amp;#039;, (0, 1, 2, 3, 4, 6, 7, 8, 9)),&lt;br /&gt;
         (&amp;#039;warnings&amp;#039;, &amp;#039;Warnings&amp;#039;, (10,)),&lt;br /&gt;
     )&lt;br /&gt;
 &lt;br /&gt;
     def __init__(self, **kwargs):&lt;br /&gt;
         self.state = &amp;#039;FIND START&amp;#039;&lt;br /&gt;
         # And various other variable initializations...&lt;br /&gt;
 &lt;br /&gt;
     def metadata(self, key, value):&lt;br /&gt;
         if key == srd.SRD_CONF_SAMPLERATE:&lt;br /&gt;
             self.samplerate = value&lt;br /&gt;
 &lt;br /&gt;
     def start(self):&lt;br /&gt;
         self.out_ann = self.register(srd.OUTPUT_ANN)&lt;br /&gt;
 &lt;br /&gt;
     def decode(self, ss, es, data):&lt;br /&gt;
         for self.samplenum, (scl, sda) in data:&lt;br /&gt;
             # Decode the samples.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The recommended name for the actual decoder file is &amp;#039;&amp;#039;&amp;#039;pd.py&amp;#039;&amp;#039;&amp;#039;. This file contains some meta information about the decoder, and the actual code itself, mostly in the &amp;#039;&amp;#039;&amp;#039;decode()&amp;#039;&amp;#039;&amp;#039; method.&lt;br /&gt;
&lt;br /&gt;
If needed, large unwieldy lists or similar things can also be factored out into another *.py file (examples: [http://sigrok.org/gitweb/?p=libsigrokdecode.git;a=tree;f=decoders/midi midi], [http://sigrok.org/gitweb/?p=libsigrokdecode.git;a=tree;f=decoders/z80 z80]).&lt;br /&gt;
&lt;br /&gt;
== Copyright and license ==&lt;br /&gt;
&lt;br /&gt;
Every protocol decoder &amp;#039;&amp;#039;&amp;#039;must&amp;#039;&amp;#039;&amp;#039; come with source code in the form of &amp;#039;&amp;#039;&amp;#039;*.py&amp;#039;&amp;#039;&amp;#039; files. No pre-compiled code should be present, Python or otherwise. The PD must not use any helpers that are not provided as source code under the same license as the PD itself.&lt;br /&gt;
&lt;br /&gt;
The &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;Decoder&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; class must have a license declaration (see above), stating the license under which all the contents in the decoder&amp;#039;s directory are provided. This is usually &amp;lt;tt&amp;gt;&amp;#039;gplv2+&amp;#039;&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;&amp;#039;gplv3+&amp;#039;&amp;lt;/tt&amp;gt;, whichever you prefer. In either case, the decoder license must be compatible with the [[libsigrokdecode]] license (which is &amp;quot;GPL, version 3 or later&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;tt&amp;gt;channels&amp;lt;/tt&amp;gt; &amp;amp; &amp;lt;tt&amp;gt;optional_channels&amp;lt;/tt&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
The following excerpt from the [[Protocol_decoder:spi|SPI]] PD shows how to use &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;channels&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;optional_channels&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;. To decode SPI, the clock signal is always needed, the chip-select signal is optional and only used when provided. To give the user the flexibility to provide only one of the MOSI/MISO signals, they are both also defined as optional:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
 class Decoder(srd.Decoder):&lt;br /&gt;
     ...&lt;br /&gt;
     id = &amp;#039;spi&amp;#039;&lt;br /&gt;
     ...&lt;br /&gt;
     channels = (&lt;br /&gt;
         {&amp;#039;id&amp;#039;: &amp;#039;clk&amp;#039;, &amp;#039;name&amp;#039;: &amp;#039;CLK&amp;#039;, &amp;#039;desc&amp;#039;: &amp;#039;Clock&amp;#039;},&lt;br /&gt;
     )&lt;br /&gt;
     optional_channels = (&lt;br /&gt;
         {&amp;#039;id&amp;#039;: &amp;#039;miso&amp;#039;, &amp;#039;name&amp;#039;: &amp;#039;MISO&amp;#039;, &amp;#039;desc&amp;#039;: &amp;#039;Master in, slave out&amp;#039;},&lt;br /&gt;
         {&amp;#039;id&amp;#039;: &amp;#039;mosi&amp;#039;, &amp;#039;name&amp;#039;: &amp;#039;MOSI&amp;#039;, &amp;#039;desc&amp;#039;: &amp;#039;Master out, slave in&amp;#039;},&lt;br /&gt;
         {&amp;#039;id&amp;#039;: &amp;#039;cs&amp;#039;, &amp;#039;name&amp;#039;: &amp;#039;CS#&amp;#039;, &amp;#039;desc&amp;#039;: &amp;#039;Chip-select&amp;#039;},&lt;br /&gt;
     )&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;data&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;, the argument of the decoder&amp;#039;s [[Protocol decoder API#decode-function|&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;decode()&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;]] function that contains the data to decode, is a list of tuples. These tuples contain the (absolute) number of the sample and the data at that sample. To process all samples, the SPI decoder loops over &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;data&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
 def decode(self, ss, es, data):&lt;br /&gt;
     ...&lt;br /&gt;
     for (self.samplenum, pins) in data:&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;channels&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;optional_channels&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; contain in total four channels, therefore the second member of the tuple is an object of Python&amp;#039;s [https://docs.python.org/3/library/stdtypes.html#typebytes &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;bytes&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;] class containing 4 bytes, one for each channel. The decoder unpacks the bytes into the variables &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;clk&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;miso&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;mosi&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;, and &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;cs&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; as shown below.&lt;br /&gt;
&lt;br /&gt;
Then, it checks for the optional channels, if their value is either 0 or 1. If it is not, that optional channel is not provided to the decoder. In the case that neither of them is supplied, an exception is raised:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
 (clk, miso, mosi, cs) = pins&lt;br /&gt;
 self.have_miso = (miso in (0, 1))&lt;br /&gt;
 self.have_mosi = (mosi in (0, 1))&lt;br /&gt;
 self.have_cs = (cs in (0, 1))&lt;br /&gt;
 &lt;br /&gt;
 # Either MISO or MOSI (but not both) can be omitted.&lt;br /&gt;
 if not (self.have_miso or self.have_mosi):&lt;br /&gt;
     raise ChannelError(&amp;#039;Either MISO or MOSI (or both) pins required.&amp;#039;)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;tt&amp;gt;annotations&amp;lt;/tt&amp;gt; &amp;amp; &amp;lt;tt&amp;gt;annotation_rows&amp;lt;/tt&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
To make the relation between the &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;annotations&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; and the &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;annotation_rows&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; members of a decoder object more clear, take a look at how the [[Protocol_decoder:Ir_nec|ir_nec]] PD uses them:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
 class Decoder(srd.Decoder):&lt;br /&gt;
     ...&lt;br /&gt;
     id = &amp;#039;ir_nec&amp;#039;&lt;br /&gt;
     ...&lt;br /&gt;
     annotations = (                        # Implicitly assigned annotation type ID&lt;br /&gt;
         (&amp;#039;bit&amp;#039;, &amp;#039;Bit&amp;#039;),                    # 0&lt;br /&gt;
         (&amp;#039;agc-pulse&amp;#039;, &amp;#039;AGC pulse&amp;#039;),        # 1&lt;br /&gt;
         (&amp;#039;longpause&amp;#039;, &amp;#039;Long pause&amp;#039;),       # 2&lt;br /&gt;
         (&amp;#039;shortpause&amp;#039;, &amp;#039;Short pause&amp;#039;),     # 3&lt;br /&gt;
         (&amp;#039;stop-bit&amp;#039;, &amp;#039;Stop bit&amp;#039;),          # 4&lt;br /&gt;
         (&amp;#039;leader-code&amp;#039;, &amp;#039;Leader code&amp;#039;),    # 5&lt;br /&gt;
         (&amp;#039;addr&amp;#039;, &amp;#039;Address&amp;#039;),               # 6&lt;br /&gt;
         (&amp;#039;addr-inv&amp;#039;, &amp;#039;Address#&amp;#039;),          # 7&lt;br /&gt;
         (&amp;#039;cmd&amp;#039;, &amp;#039;Command&amp;#039;),                # 8&lt;br /&gt;
         (&amp;#039;cmd-inv&amp;#039;, &amp;#039;Command#&amp;#039;),           # 9&lt;br /&gt;
         (&amp;#039;repeat-code&amp;#039;, &amp;#039;Repeat code&amp;#039;),    # 10&lt;br /&gt;
         (&amp;#039;remote&amp;#039;, &amp;#039;Remote&amp;#039;),              # 11&lt;br /&gt;
         (&amp;#039;warnings&amp;#039;, &amp;#039;Warnings&amp;#039;),          # 12&lt;br /&gt;
     )&lt;br /&gt;
     annotation_rows = (&lt;br /&gt;
         (&amp;#039;bits&amp;#039;, &amp;#039;Bits&amp;#039;, (0, 1, 2, 3, 4)),&lt;br /&gt;
         (&amp;#039;fields&amp;#039;, &amp;#039;Fields&amp;#039;, (5, 6, 7, 8, 9, 10)),&lt;br /&gt;
         (&amp;#039;remote&amp;#039;, &amp;#039;Remote&amp;#039;, (11,)),&lt;br /&gt;
         (&amp;#039;warnings&amp;#039;, &amp;#039;Warnings&amp;#039;, (12,)),&lt;br /&gt;
     )&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It groups the first five annotation types together into the &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;bits&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; row and the next six into the &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;fields&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; row. The rows &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;remote&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;warnings&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; both only contain one annotation type.&lt;br /&gt;
&lt;br /&gt;
Without &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;annotation_rows&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;, [[PulseView]] would have to put each annotation type in its own row (which is unhandy if the decoder has many annotations) or it would have to put them all on the same row (which would result in unreadable output due to overlaps). But because of the &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;annotation_rows&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;, the output of the [[Protocol_decoder:Ir_nec|ir_nec]] decoder is grouped together as shown in the following picture (note how different annotation types, distinguishable by their different colors, share the same row):&lt;br /&gt;
&lt;br /&gt;
[[File:Pv example ir nec cropped.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
However, as you can imagine, handling numeric IDs is quite bothersome - especially if they change and all affected IDs have to be changed throughout the PD. To avoid this, you can use a pseudo-enum:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
 ann_bit, ann_agc_pulse, ann_long_pause, ann_short_pause, ann_stop_bit, ann_leader_code, ann_addr, ann_addr_inv, ann_cmd, ann_cmd_inv, ann_repeat_code, ann_remote, ann_warning = range(13)&lt;br /&gt;
&lt;br /&gt;
 class Decoder(srd.Decoder):&lt;br /&gt;
     ...&lt;br /&gt;
     id = &amp;#039;ir_nec&amp;#039;&lt;br /&gt;
     ...&lt;br /&gt;
     annotations = (                        # Implicitly assigned annotation type ID&lt;br /&gt;
         (&amp;#039;bit&amp;#039;, &amp;#039;Bit&amp;#039;),                    # 0  = ann_bit&lt;br /&gt;
         (&amp;#039;agc-pulse&amp;#039;, &amp;#039;AGC pulse&amp;#039;),        # 1  = ann_agc_pulse&lt;br /&gt;
         (&amp;#039;longpause&amp;#039;, &amp;#039;Long pause&amp;#039;),       # 2  = ann_long_pause&lt;br /&gt;
         (&amp;#039;shortpause&amp;#039;, &amp;#039;Short pause&amp;#039;),     # 3  = ann_short_pause&lt;br /&gt;
         (&amp;#039;stop-bit&amp;#039;, &amp;#039;Stop bit&amp;#039;),          # 4  = ann_stop_bit&lt;br /&gt;
         (&amp;#039;leader-code&amp;#039;, &amp;#039;Leader code&amp;#039;),    # 5  = ann_leader_code&lt;br /&gt;
         (&amp;#039;addr&amp;#039;, &amp;#039;Address&amp;#039;),               # 6  = ann_addr&lt;br /&gt;
         (&amp;#039;addr-inv&amp;#039;, &amp;#039;Address#&amp;#039;),          # 7  = ann_addr_inv&lt;br /&gt;
         (&amp;#039;cmd&amp;#039;, &amp;#039;Command&amp;#039;),                # 8  = ann_cmd&lt;br /&gt;
         (&amp;#039;cmd-inv&amp;#039;, &amp;#039;Command#&amp;#039;),           # 9  = ann_cmd_inv&lt;br /&gt;
         (&amp;#039;repeat-code&amp;#039;, &amp;#039;Repeat code&amp;#039;),    # 10 = ann_repeat_code&lt;br /&gt;
         (&amp;#039;remote&amp;#039;, &amp;#039;Remote&amp;#039;),              # 11 = ann_remote&lt;br /&gt;
         (&amp;#039;warnings&amp;#039;, &amp;#039;Warnings&amp;#039;),          # 12 = ann_warning&lt;br /&gt;
     )&lt;br /&gt;
     annotation_rows = (&lt;br /&gt;
         (&amp;#039;bits&amp;#039;, &amp;#039;Bits&amp;#039;, (ann_bit, ann_agc_pulse, ann_long_pause, ann_short_pause, ann_stop_bit)),&lt;br /&gt;
         (&amp;#039;fields&amp;#039;, &amp;#039;Fields&amp;#039;, (ann_leader_code, ann_addr, ann_addr_inv, ann_cmd, ann_cmd_inv, ann_repeat_code)),&lt;br /&gt;
         (&amp;#039;remote&amp;#039;, &amp;#039;Remote&amp;#039;, (ann_remote,)),&lt;br /&gt;
         (&amp;#039;warnings&amp;#039;, &amp;#039;Warnings&amp;#039;, (ann_warning,)),&lt;br /&gt;
     )&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This way, all you need to ensure is that the order of the enum entries is the same as in the annotations array and you&amp;#039;re set. There is one downside, though, as always: pseudo-enums are pitifully slow in python, so if you use them and you use them in a lot of places, your protocol decoder may be significantly slower (up to 4x has been observed), so choose wisely. You can use the PD test facility to compare, using e.g. &amp;#039;time ./pdtest -r $YOUR_PD&amp;#039;&lt;br /&gt;
&lt;br /&gt;
== Random notes, tips and tricks ==&lt;br /&gt;
&lt;br /&gt;
* You should usually only use &amp;#039;&amp;#039;&amp;#039;raise&amp;#039;&amp;#039;&amp;#039; in a protocol decoder to raise exceptions in cases which are a clear bug in how the protocol decoder is invoked (e.g. if no samplerate was provided for a PD which needs the samplerate, or if some of the required channels were not provided by the user, and so on).&lt;br /&gt;
* Use the &amp;lt;code&amp;gt;has_channel()&amp;lt;/code&amp;gt; method to check whether an optional channel has been provided or not.&lt;br /&gt;
* A simple and fast way to calculate a parity (i.e., count the number of 1 bits) over a number (0x55 in this example) is:&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
 ones = bin(0x55).count(&amp;#039;1&amp;#039;)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* A simple function to convert a BCD number (max. 8 bits) to an integer is:&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
 def bcd2int(b):&lt;br /&gt;
     return (b &amp;amp; 0x0f) + ((b &amp;gt;&amp;gt; 4) * 10)&lt;br /&gt;
&amp;lt;/source&amp;gt; This is available as &amp;lt;code&amp;gt;from common.srdhelper import bcd2int&amp;lt;/code&amp;gt;&lt;br /&gt;
* An elegant way to convert a sequence of bus pins to a numeric value:&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
 from functools import reduce&lt;br /&gt;
&lt;br /&gt;
 def reduce_bus(bus):&lt;br /&gt;
     if 0xFF in bus:&lt;br /&gt;
         return None # unassigned bus channels&lt;br /&gt;
     else:&lt;br /&gt;
         return reduce(lambda a, b: (a &amp;lt;&amp;lt; 1) | b, reversed(bus))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* A nice way to construct method names according to e.g. protocol commands is (assuming &amp;#039;&amp;#039;&amp;#039;cmd&amp;#039;&amp;#039;&amp;#039; is 8, this would call the function &amp;#039;&amp;#039;&amp;#039;self.handle_cmd_0x08&amp;#039;&amp;#039;&amp;#039;):&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
 fn = getattr(self, &amp;#039;handle_cmd_0x%02x&amp;#039; % cmd);&lt;br /&gt;
 fn(arg1, arg2, ...)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* A cheap way to deal with Python&amp;#039;s lack of enumerations (useful for states, pin indices, annotation indices, etc.):&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
 class Cycle:&lt;br /&gt;
     NONE, MEMRD, MEMWR, IORD, IOWR, FETCH, INTACK = range(7)&lt;br /&gt;
&amp;lt;/source&amp;gt;Please be aware, though, that using this mechanism may slow down your decoder significantly. It may make sense to perform some basic profiling to see if this affects you, e.g. using &amp;lt;code&amp;gt;time ./pdtest -r $YOUR_PD&amp;lt;/code&amp;gt;.&lt;br /&gt;
** A class &amp;lt;code&amp;gt;SrdIntEnum&amp;lt;/code&amp;gt; is now available from &amp;lt;code&amp;gt;common.srdhelper&amp;lt;/code&amp;gt; based on Python&amp;#039;s native [https://docs.python.org/3/library/enum.html#enum.IntEnum &amp;lt;code&amp;gt;IntEnum&amp;lt;/code&amp;gt;]&lt;br /&gt;
* &amp;lt;div id=&amp;quot;SIGROKDECODE_DIR&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;You don&amp;#039;t need to reinstall the whole [[libsigrokdecode]] project every time you make a change on your decoder. Instead, you can use the environment variable &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;SIGROKDECODE_DIR&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; to point the software to your development directory:&amp;lt;br /&amp;gt;&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;$ SIGROKDECODE_DIR=/path/to/libsigrokdecode/decoders/ sigrok-cli … -P &amp;lt;decodername&amp;gt;&amp;lt;/source&amp;gt;Because this environment variable is evaluated by the [[libsigrokdecode]] code itself, it can be used for any program that uses the library, for example when calling [[PulseView]] or the &amp;#039;&amp;#039;&amp;#039;&amp;lt;tt&amp;gt;pdtest&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039; unit test utility from the [http://sigrok.org/gitweb/?p=sigrok-test.git;a=summary sigrok-test] repository.&amp;lt;br /&amp;gt;If you compiled a recent [[libsigrokdecode]] by yourself ([http://sigrok.org/gitweb/?p=libsigrokdecode.git;a=commit;h=40c6ac1d3fbded276dcbff23e8bc099896ab2fb5 newer than this commit]), you can also put decoders into your home directory, without the need for an additional environment variable. On Linux systems, this name follows the [http://standards.freedesktop.org/basedir-spec/latest/ar01s03.html XDG base directory specification], which by default resolves to &amp;lt;tt&amp;gt;~/.local/share/libsigrokdecode/decoders&amp;lt;/tt&amp;gt;. If that folder does not exist, you can simply create it and drop your decoders there, in their own subdirectory, like you would do in the libsigrokdecode source tree. On Windows systems additional decoders are read from &amp;lt;tt&amp;gt;%ProgramData%\libsigrokdecode\decoders&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* To debug the Python implementation of a decoder during development, maintenance or research either add &amp;lt;code&amp;gt;print()&amp;lt;/code&amp;gt; statements at appropriate locations. Or get WinPDB and use the remote debugging feature as outlined below (add this hook somewhere in pd.py, then &amp;quot;File -&amp;gt; Attach&amp;quot; to the running process). Decoders cannot be used in &amp;quot;regular&amp;quot; debuggers since they expect a rather specific environment to execute in, for all of receiving their input as well as having their output saved or presented as well as processing samples (data types, runtime routines). Remote debugging works in both the sigrok-cli and pulseview context. Adding another &amp;lt;code&amp;gt;print()&amp;lt;/code&amp;gt; statement before starting the embedded debugger can help identify the moment in time when to attach.&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
 def __init__():&lt;br /&gt;
     import rpdb2&lt;br /&gt;
     rpdb2.start_embedded_debugger(&amp;quot;pd&amp;quot;)&lt;br /&gt;
     ...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For Windows you might want to use the following code, adapting it to your Python and WinPDB-reborn version:&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
 def __init__():&lt;br /&gt;
     import sys&lt;br /&gt;
     sys.path.insert(0, &amp;#039;c:/Program Files (x86)/Python38-32/Lib/site-packages/winpdb_reborn-2.0.0.1-py3.8.egg&amp;#039;)&lt;br /&gt;
     import rpdb2&lt;br /&gt;
     rpdb2.start_embedded_debugger(&amp;quot;pd&amp;quot;, fAllowRemote=True)&lt;br /&gt;
     ...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Unit tests ==&lt;br /&gt;
&lt;br /&gt;
In order to keep protocol decoders in a running state even when we make changes to a decoder or libsigrokdecode itself, we use unit tests for as many decoders as we can. These are stored in the [http://sigrok.org/gitweb/?p=sigrok-test.git sigrok-test repository]. If you want to add, modify or run one of them, clone that repository and [https://sigrok.org/gitweb/?p=sigrok-test.git;a=blob;f=README check the README] for documentation.&lt;br /&gt;
We greatly appreciate it when you submit unit tests for your decoder so we can keep it in good health!&lt;br /&gt;
&lt;br /&gt;
== Submitting your decoder ==&lt;br /&gt;
&lt;br /&gt;
When you&amp;#039;ve finished your decoder and everything is working nicely, please contribute the decoder to the sigrok project so that other people can benefit from it (and test it, improve upon it, and so on).&lt;br /&gt;
&lt;br /&gt;
* Check the decoder&amp;#039;s operation in the most recent version of the software. You expect the decoder to get accepted in the project&amp;#039;s mainline codebase. So it should work in that environment. Either build from up-to-date sources, or download nightly builds.&lt;br /&gt;
* Tell us about the location of your public git repo on the &amp;#039;&amp;#039;&amp;#039;#sigrok&amp;#039;&amp;#039;&amp;#039; IRC channel on libera.chat. As an alternative send the decoder to the [https://lists.sourceforge.net/lists/listinfo/sigrok-devel sigrok-devel] mailing list (preferrably against current master and as a full commit instead of a mere diff). Remember that pushing to a public git repo is preferred over email attachments.&lt;br /&gt;
* Please also make example data files (*.sr) including a small README available. Developers need these in order to properly review and test your decoder. Users need these to learn what the captures are about in the first place. Preferrably these files should also come as patches against the latest git master of the [http://sigrok.org/gitweb/?p=sigrok-dumps.git;a=tree sigrok-dumps] repository. See [[Example dumps]] for details. Submitting captures before any decoder materializes or work on a decoder even starts is very useful.&lt;br /&gt;
* Finally, please also consider adding a few &amp;quot;unit tests&amp;quot; for your decoder in the [http://sigrok.org/gitweb/?p=sigrok-test.git;a=tree sigrok-test] repository. These test will automatically run the decoder against various input files specified in &amp;#039;&amp;#039;&amp;#039;test.conf&amp;#039;&amp;#039;&amp;#039; and check whether the expected output is produced (examples: [http://sigrok.org/gitweb/?p=sigrok-test.git;a=blob;f=decoder/test/rfm12/test.conf rfm12], [http://sigrok.org/gitweb/?p=sigrok-test.git;a=blob;f=decoder/test/nrf24l01/test.conf nrf24l01]). This allows us to notice and fix any regressions in the decoder and/or the [[libsigrokdecode]] backend that may arise over time.&lt;br /&gt;
&lt;br /&gt;
Thanks a lot!&lt;br /&gt;
&lt;br /&gt;
[[Category:APIs]]&lt;/div&gt;</summary>
		<author><name>Endolith</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=User:Endolith&amp;diff=16131</id>
		<title>User:Endolith</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=User:Endolith&amp;diff=16131"/>
		<updated>2021-07-19T13:24:12Z</updated>

		<summary type="html">&lt;p&gt;Endolith: Created page with &amp;quot;https://github.com/endolith/libsigrokdecode&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;https://github.com/endolith/libsigrokdecode&lt;/div&gt;</summary>
		<author><name>Endolith</name></author>
	</entry>
</feed>