<?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=Danielk</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=Danielk"/>
	<link rel="alternate" type="text/html" href="https://sigrok.org/wiki/Special:Contributions/Danielk"/>
	<updated>2026-05-07T05:35:16Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.37.1</generator>
	<entry>
		<id>https://sigrok.org/w/index.php?title=Downloads&amp;diff=11376</id>
		<title>Downloads</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=Downloads&amp;diff=11376"/>
		<updated>2016-01-03T22:13:58Z</updated>

		<summary type="html">&lt;p&gt;Danielk: Advertise my Ubuntu PPA&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Releases ==&lt;br /&gt;
&lt;br /&gt;
You can download the latest released tarballs of the following subprojects from [http://sigrok.org/download/ the sigrok.org download directory]:&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;
|-&lt;br /&gt;
!Project&lt;br /&gt;
!Release/download&lt;br /&gt;
!News&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [[libserialport]]&lt;br /&gt;
| [http://sigrok.org/download/source/libserialport/libserialport-0.1.0.tar.gz libserialport-0.1.0.tar.gz]&lt;br /&gt;
| [http://sigrok.org/gitweb/?p=libserialport.git;a=blob;f=NEWS;hb=HEAD release notes]&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [[libsigrok]]&lt;br /&gt;
| [http://sigrok.org/download/source/libsigrok/libsigrok-0.3.0.tar.gz libsigrok-0.3.0.tar.gz]&lt;br /&gt;
| [http://sigrok.org/gitweb/?p=libsigrok.git;a=blob;f=NEWS;hb=HEAD release notes]&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [[libsigrokdecode]]&lt;br /&gt;
| [http://sigrok.org/download/source/libsigrokdecode/libsigrokdecode-0.3.1.tar.gz libsigrokdecode-0.3.1.tar.gz]&lt;br /&gt;
| [http://sigrok.org/gitweb/?p=libsigrokdecode.git;a=blob;f=NEWS;hb=HEAD release notes]&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [[sigrok-cli]]&lt;br /&gt;
| [http://sigrok.org/download/source/sigrok-cli/sigrok-cli-0.5.0.tar.gz sigrok-cli-0.5.0.tar.gz]&lt;br /&gt;
| [http://sigrok.org/gitweb/?p=sigrok-cli.git;a=blob;f=NEWS;hb=HEAD release notes]&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [[PulseView]]&lt;br /&gt;
| [http://sigrok.org/download/source/pulseview/pulseview-0.2.0.tar.gz pulseview-0.2.0.tar.gz]&lt;br /&gt;
| [http://sigrok.org/gitweb/?p=pulseview.git;a=blob;f=NEWS;hb=HEAD release notes]&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [[Example dumps|sigrok-dumps]]&lt;br /&gt;
| [http://sigrok.org/download/source/sigrok-dumps/sigrok-dumps-0.1.0.tar.gz sigrok-dumps-0.1.0.tar.gz]&lt;br /&gt;
| [http://sigrok.org/gitweb/?p=sigrok-dumps.git;a=blob;f=NEWS;hb=HEAD release notes]&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [[fx2lafw|sigrok-firmware-fx2lafw]] (source code)&lt;br /&gt;
| [http://sigrok.org/download/source/sigrok-firmware-fx2lafw/sigrok-firmware-fx2lafw-0.1.3.tar.gz sigrok-firmware-fx2lafw-0.1.3.tar.gz]&lt;br /&gt;
| [http://sigrok.org/gitweb/?p=sigrok-firmware-fx2lafw.git;a=blob;f=NEWS;hb=HEAD release notes]&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [[fx2lafw|sigrok-firmware-fx2lafw]] (prebuilt firmware)&lt;br /&gt;
| [http://sigrok.org/download/binary/sigrok-firmware-fx2lafw/sigrok-firmware-fx2lafw-bin-0.1.3.tar.gz sigrok-firmware-fx2lafw-bin-0.1.3.tar.gz]&lt;br /&gt;
| [http://sigrok.org/gitweb/?p=sigrok-firmware-fx2lafw.git;a=blob;f=NEWS;hb=HEAD release notes]&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Binaries and distribution packages ==&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Debian:&amp;#039;&amp;#039;&amp;#039; [http://packages.qa.debian.org/s/sigrok.html sigrok] (pulls [http://packages.qa.debian.org/libs/libserialport.html libserialport], [http://packages.qa.debian.org/libs/libsigrok.html libsigrok], [http://packages.qa.debian.org/libs/libsigrokdecode.html libsigrokdecode], [http://packages.qa.debian.org/s/sigrok-cli.html sigrok-cli], [http://packages.qa.debian.org/p/pulseview.html pulseview], [http://packages.qa.debian.org/s/sigrok-firmware-fx2lafw.html sigrok-firmware-fx2lafw])&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ubuntu:&amp;#039;&amp;#039;&amp;#039; [http://launchpad.net/ubuntu/+source/sigrok sigrok] (pulls [http://launchpad.net/ubuntu/+source/libserialport libserialport], [http://launchpad.net/ubuntu/+source/libsigrok libsigrok], [http://launchpad.net/ubuntu/+source/libsigrokdecode libsigrokdecode], [http://launchpad.net/ubuntu/+source/sigrok-cli sigrok-cli], [http://launchpad.net/ubuntu/+source/pulseview pulseview], [http://launchpad.net/ubuntu/+source/sigrok-firmware-fx2lafw sigrok-firmware-fx2lafw])&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Ubuntu PPA:&amp;#039;&amp;#039;&amp;#039; [https://launchpad.net/~daniel-elstner/+archive/ubuntu/sigrok PPA for sigrok] (recent sigrok builds from git, including firmware)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Arch Linux:&amp;#039;&amp;#039;&amp;#039; [https://aur.archlinux.org/packages.php?O=0&amp;amp;K=sigrok&amp;amp;do_Search=Go AUR (Arch Linux User Repository)], [https://aur.archlinux.org/packages/libserialport/ libserialport], [https://aur.archlinux.org/packages/libsigrok/ libsigrok], [https://aur.archlinux.org/packages/libsigrokdecode/ libsigrokdecode], [https://aur.archlinux.org/packages/sigrok-cli/ sigrok-cli], [https://aur.archlinux.org/packages/pulseview/ pulseview], [https://aur.archlinux.org/packages/sigrok-firmware-fx2lafw/ sigrok-firmware-fx2lafw]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Slackware:&amp;#039;&amp;#039;&amp;#039; [http://slackbuilds.org/repository/14.1/libraries/libserialport/?search=libserialport libserialport], [http://slackbuilds.org/repository/14.1/libraries/libsigrok/ libsigrok], [http://slackbuilds.org/repository/14.1/libraries/libsigrokdecode/ libsigrokdecode], [http://slackbuilds.org/repository/14.1/academic/sigrok-cli/?search=sigrok-cli sigrok-cli], [http://slackbuilds.org/repository/14.1/academic/pulseview/?search=pulseview pulseview], [http://slackbuilds.org/repository/14.1/misc/sigrok-firmware-fx2lafw/?search=sigrok-firmware-fx2lafw sigrok-firmware-fx2lafw]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Fedora:&amp;#039;&amp;#039;&amp;#039; [http://pkgs.fedoraproject.org/cgit/libserialport.git/ libserialport], [http://pkgs.fedoraproject.org/cgit/libsigrok.git/ libsigrok], [http://pkgs.fedoraproject.org/cgit/libsigrokdecode.git libsigrokdecode], [http://pkgs.fedoraproject.org/cgit/sigrok-cli.git sigrok-cli], [http://pkgs.fedoraproject.org/cgit/pulseview.git pulseview], [http://pkgs.fedoraproject.org/cgit/sigrok-firmware-fx2lafw.git sigrok-firmware-fx2lafw], [http://pkgs.fedoraproject.org/cgit/sigrok-firmware.git sigrok-firmware] (see also: [[Linux/Fedora]])&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Gentoo:&amp;#039;&amp;#039;&amp;#039; [http://packages.gentoo.org/package/dev-libs/libserialport libserialport], [http://packages.gentoo.org/package/sci-libs/libsigrok libsigrok], [http://packages.gentoo.org/package/sci-libs/libsigrokdecode libsigrokdecode], [http://packages.gentoo.org/package/sci-electronics/sigrok-cli sigrok-cli], [http://packages.gentoo.org/package/sci-electronics/pulseview pulseview], [http://packages.gentoo.org/package/sys-firmware/sigrok-firmware-fx2lafw sigrok-firmware-fx2lafw]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;openSUSE:&amp;#039;&amp;#039;&amp;#039; [https://build.opensuse.org/package/show/electronics/libserialport libserialport], [https://build.opensuse.org/package/show/electronics/libsigrok libsigrok], [https://build.opensuse.org/package/show/electronics/libsigrokdecode libsigrokdecode], [https://build.opensuse.org/package/show/electronics/sigrok-cli sigrok-cli], [https://build.opensuse.org/package/show/electronics/pulseview pulseview], [https://build.opensuse.org/package/show/electronics/sigrok-firmware-fx2lafw sigrok-firmware-fx2lafw]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Windows:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
** Nightly installer binaries: [http://sigrok.org/jenkins/job/sigrok-cross-mingw/platform=cross-i686-w64-mingw32/lastSuccessfulBuild/artifact/pulseview-NIGHTLY-installer.exe pulseview-NIGHTLY-installer.exe], [http://sigrok.org/jenkins/job/sigrok-cross-mingw/platform=cross-i686-w64-mingw32/lastSuccessfulBuild/artifact/sigrok-cli-NIGHTLY-installer.exe sigrok-cli-NIGHTLY-installer.exe]&lt;br /&gt;
** See also [[Windows#Windows_installers|Windows]] for more information, including driver and firmware handling.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Mac OS X:&amp;#039;&amp;#039;&amp;#039; There are [[Mac_OS_X#Building_using_Homebrew|Homebrew packages]] ([https://github.com/rene-dev/homebrew-sigrok github repo]), but you can also [[Mac_OS_X#Building_manually|compile sigrok from source]].&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;FreeBSD:&amp;#039;&amp;#039;&amp;#039; [http://www.freshports.org/devel/libserialport/ libserialport], [http://www.freshports.org/devel/libsigrok/ libsigrok], [http://www.freshports.org/devel/libsigrokdecode/ libsigrokdecode], [http://www.freshports.org/science/sigrok-cli/ sigrok-cli], [http://www.freshports.org/science/pulseview/ pulseview], [http://www.freshports.org/science/sigrok-firmware-fx2lafw/ sigrok-firmware-fx2lafw], [http://www.freshports.org/science/sigrok-firmware/ sigrok-firmware], [http://www.freshports.org/science/sigrok-firmware-utils/ sigrok-firmware-utils]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;OpenBSD:&amp;#039;&amp;#039;&amp;#039; There are no ports/packages yet, contributors welcome!&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Android:&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
** [[PulseView]] nightly build: [http://sigrok.org/jenkins/job/sigrok-cross-android/platform=cross-arm-linux-androideabi/lastSuccessfulBuild/artifact/PulseView-NIGHTLY.apk PulseView-NIGHTLY.apk (ARM)], [http://sigrok.org/jenkins/job/sigrok-cross-android/platform=cross-i686-linux-android/lastSuccessfulBuild/artifact/PulseView-NIGHTLY.apk PulseView-NIGHTLY.apk (x86)]&lt;br /&gt;
** See also [[Android]] for more information.&lt;br /&gt;
&lt;br /&gt;
Please contact us if you want to work on packages for other Linux distributions or OSes.&lt;br /&gt;
&lt;br /&gt;
== Source code ==&lt;br /&gt;
&lt;br /&gt;
The development is done in various [http://sigrok.org/gitweb/ git repositories].&lt;br /&gt;
&lt;br /&gt;
See [[Building]] for build instructions.&lt;br /&gt;
&lt;br /&gt;
== Example data ==&lt;br /&gt;
&lt;br /&gt;
See the [[Example dumps]] wiki page.&lt;br /&gt;
&lt;br /&gt;
== Firmware files ==&lt;br /&gt;
&lt;br /&gt;
See the [[Firmware]] wiki page.&lt;/div&gt;</summary>
		<author><name>Danielk</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=Supported_hardware&amp;diff=11274</id>
		<title>Supported hardware</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=Supported_hardware&amp;diff=11274"/>
		<updated>2015-11-28T14:43:27Z</updated>

		<summary type="html">&lt;p&gt;Danielk: SysClk LWLA1016 now supported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;sigrok is intended as a flexible, cross-platform, and &amp;#039;&amp;#039;&amp;#039;hardware-independent&amp;#039;&amp;#039;&amp;#039; software suite, i.e., it supports various devices from many different vendors.&lt;br /&gt;
&lt;br /&gt;
Here is a list of currently supported devices (various stages of completeness) and devices we plan to support in the near future.&lt;br /&gt;
&lt;br /&gt;
The lists are sorted by category ([[File:Nuvola OK.png|16px]] &amp;lt;span style=&amp;quot;background-color: lime&amp;quot;&amp;gt;supported&amp;lt;/span&amp;gt;: [[:Category:Supported|{{PAGESINCATEGORY:Supported|pages}}]], [[File:Nuvola Orange.png|16px]] &amp;lt;span style=&amp;quot;background-color: orange&amp;quot;&amp;gt;in progress&amp;lt;/span&amp;gt;: [[:Category:In progress|{{PAGESINCATEGORY:In progress|pages}}]], [[File:Nuvola Red.png|16px]] &amp;lt;span style=&amp;quot;background-color: red&amp;quot;&amp;gt;planned&amp;lt;/span&amp;gt;: [[:Category:Planned|{{PAGESINCATEGORY:Planned|pages}}]]), and alphabetically within those categories.&lt;br /&gt;
&lt;br /&gt;
== Logic analyzers ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;100px&amp;quot; heights=&amp;quot;100px&amp;quot;&amp;gt;&lt;br /&gt;
File:ARMFLY MINI LOGIC.png|link=ARMFLY Mini-Logic|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[ARMFLY Mini-Logic]] (8ch, 24MHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:ASIX SIGMA 2.png|link=ASIX SIGMA|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[ASIX SIGMA]] (16ch, 200MHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:BeagleLogic.jpg|link=BeagleLogic|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[BeagleLogic]] (12(max 14)ch, 100MHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Braintechnology_usb_interface_v26.png|link=Braintechnology USB Interface V2.x|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Braintechnology USB Interface V2.x]] (8/16ch, 24/12MHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Braintechnology_usb_lps.png|link=Braintechnology USB-LPS|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Braintechnology USB-LPS]] (8/16ch, 24/12MHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Chronovu la8 front.png|link=ChronoVu LA8|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[ChronoVu LA8]] (8ch, 100MHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Chronovu la16.png|link=ChronoVu LA16|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[ChronoVu LA16]] (16ch, 200MHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Cwav_usbee_sx.png|link=CWAV USBee SX|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[CWAV USBee SX]] (8ch, 24MHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Buspirate_v3.png|link=Dangerous Prototypes Buspirate|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Dangerous Prototypes Buspirate]] (5ch, 1MHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Dangerous prototypes irtoy mugshot.png|link=Dangerous Prototypes USB IR Toy|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Dangerous Prototypes USB IR Toy]] (1ch, 10kHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Eeelec xla esla100.png|link=EE Electronics ESLA100|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[EE Electronics ESLA100]] (8ch, 24MHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Ikalogic_scanalogic2.png|link=IKALOGIC Scanalogic-2|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[IKALOGIC Scanalogic-2]] (4ch, 20MHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Ikalogic scanaplus mugshot.png|link=IKALOGIC ScanaPLUS|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[IKALOGIC ScanaPLUS]] (9ch, 100MHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Kingst kqs3506 la16100.png|link=KingST KQS3506-LA16100|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[KingST KQS3506-LA16100]] (16ch, 100/50/32/16MHz @ 3/6/9/16ch)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Lcsoft-miniboard-front.png|link=Lcsoft Mini Board|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Lcsoft Mini Board]] (8/16ch, 24/12MHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:logic-shrimp-front.png|link=Logic Shrimp|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Logic Shrimp]] (4ch, 20MHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Mcu123 saleae logic clone.png|link=MCU123 Saleae Logic clone|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[MCU123 Saleae Logic clone]] (8ch, 24MHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Usbee_ax_clone_front.png|link=MCU123 USBee AX Pro clone|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[MCU123 USBee AX Pro clone]] (8ch, 24MHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Mcupro_Logic16_overview.png|link=mcupro Logic16 clone|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[mcupro Logic16 clone]] (16ch, 100MHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Openbench logic sniffer front.png|link=Openbench Logic Sniffer|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Openbench Logic Sniffer]] (32ch, 100MHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Prist akip 9101 mugshot.png|link=Prist AKIP-9101|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Prist AKIP-9101]] (16ch, 200MHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Robomotic buglogic3.png|link=Robomotic BugLogic 3|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Robomotic BugLogic 3]] (8ch, 24MHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Robomotic_minilogic.png|link=Robomotic MiniLogic|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Robomotic MiniLogic]] (8ch, 24MHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Saleae Logic.png|link=Saleae Logic|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Saleae Logic]] (8ch, 24MHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Saleae_Logic16_bottom.png|link=Saleae Logic16|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Saleae Logic16]] (16ch, 100/50/32/16MHz @ 3/6/9/16ch)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Saanlima Pipistrello-OLS.png|link=Saanlima Pipistrello OLS|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Saanlima Pipistrello OLS]] (32ch, 100MHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Sysclk lwla1016.png|link=Sysclk LWLA1016|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Sysclk LWLA1016]] (16ch, 100MHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Sysclk lwla1034 mugshot.png|link=Sysclk LWLA1034|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Sysclk LWLA1034]] (34ch, 125MHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Wayengineer saleae16.png|link=WayEngineer Saleae16|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[WayEngineer Saleae16]] (16ch, 100/50/32/16MHz @ 3/6/9/16ch)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Zeroplus Logic Cube.png|link=ZEROPLUS Logic Cube LAP-C(16032)|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[ZEROPLUS Logic Cube LAP-C(16032)]] (16ch, 100MHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Zeroplus Logic Cube.png|link=ZEROPLUS Logic Cube LAP-C(322000)|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[ZEROPLUS Logic Cube LAP-C(322000)]] (32ch, 200MHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Zeroplus_lap-16128u.png|link=ZEROPLUS LAP-16128U|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[ZEROPLUS LAP-16128U]] (16ch, 200MHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:ASIX Omega.png|link=ASIX OMEGA|[[File:Nuvola Orange.png|16px]] &amp;lt;small&amp;gt;[[ASIX OMEGA]] (16ch, 400MHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:DSLogic.png|link=DreamSourceLab DSLogic|[[File:Nuvola Orange.png|16px]] &amp;lt;small&amp;gt;[[DreamSourceLab DSLogic]] (16ch, 400MHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Hsa-logic.png|link=HSA Logic|[[File:Nuvola Orange.png|16px]] &amp;lt;small&amp;gt;[[HSA Logic]] (8ch, 6.25MHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:RockyLogic Ant18e.png|link=RockyLogic Ant18e|[[File:Nuvola Orange.png|16px]] &amp;lt;small&amp;gt;[[RockyLogic Ant18e]] (8ch, 1GHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Sysclk sla5032 mugshot.png|link=Sysclk SLA5032|[[File:Nuvola Orange.png|16px]] &amp;lt;small&amp;gt;[[Sysclk SLA5032]] (32ch, 500MHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:Acute_pkla1216.png|link=Acute PKLA-1216|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Acute PKLA-1216]] (16ch, 200MHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Hantek 4032l mugshot.png|link=Hantek 4032L|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Hantek 4032L]] (32ch, 400MHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Ideofy_la_08.png|link=Ideofy LA-08|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Ideofy LA-08]] (8ch, 96/60/30MHz @ 2/4/8ch)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Intronix Logicport.png|link=Intronix Logicport LA1034|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Intronix Logicport LA1034]] (34ch, 500MHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Sigrok_logo_no_text_transparent_512.png|link=Link Instruments LA-5580|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Link Instruments LA-5580]] (80ch, 500MHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Microchip_pickit2.png|link=Microchip PICkit2|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Microchip PICkit2]] (3ch, 1MHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Minila parport.png|link=MiniLA|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[MiniLA]] (32ch, 100MHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Minila_mockup.png|link=MiniLA Mockup|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[MiniLA Mockup]] (32ch, 100MHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Noname_la16_mugshot.png|link=Noname LA16|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Noname LA16]] (16ch, 100MHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Noname xl logic16 100m mugshot.png|link=Noname XL-LOGIC16-100M|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Noname XL-LOGIC16-100M]] (16ch, 100/50/32/16MHz @ 3/6/9/16ch)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Rockylogic_ant8.png|link=RockyLogic Ant8|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[RockyLogic Ant8]] (8ch, 500MHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Sysclk lwla2034 mugshot.png|link=Sysclk LWLA2034|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Sysclk LWLA2034]] (34ch, 200MHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Techtools_digiview_dv1-100.png|link=TechTools DigiView DV1-100|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[TechTools DigiView DV1-100]] (18ch, 100MHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Xmos xtag2.png|link=XMOS XTAG-2|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[XMOS XTAG-2]] (?ch, 50MHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Zlg_la1032.png|link=ZLG LA1032|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[ZLG LA1032]] (32ch, 100MHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mixed-signal devices ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=105px heights=105px&amp;gt;&lt;br /&gt;
File:Armfly_ax_pro.png|link=ARMFLY AX-Pro|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[ARMFLY AX-Pro]]&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; (8ch, 24MHz; 2ch analog, 24MSa/s, 40MHz BW)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Sysclk ax pro mugshot.png|link=Sysclk AX-Pro|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Sysclk AX-Pro]]&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; (8ch, 24MHz; 2ch analog, 24MSa/s, 3MHz BW)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Esla201a.png|link=EE Electronics ESLA201A|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[EE Electronics ESLA201A]]&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; (8ch, 24MHz; 2ch analog, 24MSa/s, 40MHz BW)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Rigol DS1052E.png|link=Rigol DS1000 series|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Rigol DS1000 series|Rigol DS1000D series]] (16ch, 2ch analog, 50-150MHz BW)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Rigol_VS5202D.png|link=Rigol VS5000 series|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Rigol VS5000 series|Rigol VS5000D series]] (16ch, 2ch analog, 20-200MHz BW&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Yokogawa DLM2000 front.png|link=Yokogawa DLM2000 series|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Yokogawa DLM2000 series]] (8ch, 2/4ch analog, 2.5GSa/s, 200/350/500MHz BW)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Xzl studio ax mugshot.png|link=XZL_Studio AX|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[XZL_Studio AX]]&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; (8ch, 24MHz; 2ch analog, 24MSa/s, 40MHz BW)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:BitScope BS10.png|link=BitScope BS10|[[File:Nuvola Orange.png|16px]] &amp;lt;small&amp;gt;[[BitScope BS10]] (8ch, 40MHz; 2ch analog, 20MSa/s, ? BW)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Link Instruments MSO-19 front.png|link=Link Instruments MSO-19|[[File:Nuvola Orange.png|16px]] &amp;lt;small&amp;gt;[[Link Instruments MSO-19]] (8ch, 200MHz; 1ch analog, 200MSa/s, 60MHz BW)&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:Agilent_MSO7104A.png|link=Agilent MSO7104A|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Agilent MSO7104A]] (16ch, ?; 4ch analog, 2GSa/s, 1GHz BW)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Digilent_analog_discovery.png|link=Digilent Analog Discovery|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Digilent Analog Discovery]] (16ch, 100MHz; 2ch analog, 100MSa/s, 5MHz BW)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Hantek_1008C.png|link=Hantek 1008C|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Hantek 1008C]] (8ch)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Lab nation smartscope mugshot.png|link=LabNation SmartScope|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[LabNation SmartScope]] (8ch, 100MHz; 2ch analog, 100MSa/s, 45MHz BW)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Meilhaus_mephisto_scope1.png|link=Meilhaus MEphisto Scope1|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Meilhaus MEphisto Scope1]] (16ch, 100kHz; 2ch analog, 1MSa/s, 500kHz BW)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Polabs_poscope_basic2.png|link=PoLabs PoScope Basic2|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[PoLabs PoScope Basic2]] (16ch, 8MHz; 2ch analog, 200kSa/s, ? BW)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:QuantAsylum QA100.png|link=QuantAsylum QA100|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[QuantAsylum QA100]] (12ch; 2ch analog)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Saleae Logic Pro 16 bottom.jpg|link=Saleae Logic Pro 16|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Saleae Logic Pro 16]] (4/16ch, 500/100MHz; 16ch analog, 50MSa/s, 5MHz BW)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Sigrok_logo_no_text_transparent_512.png|link=XZL_Studio DX|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[XZL_Studio DX]] (16ch, 24MHz; 2ch analog)&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; Only the logic analyzer functionality is supported so far, analog support is work in progress.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Oscilloscopes ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=100px heights=100px&amp;gt;&lt;br /&gt;
File:Agilent DSO1014A.png|link=Agilent DSO1000 series|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Agilent DSO1000 series]] (2-4ch, 2GS/s, 60-200MHz BW)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Fluke_Scopemeter_199B.png|link=Fluke ScopeMeter 199B|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Fluke ScopeMeter 199B]] (2ch, 2.5GS/s, 200MHz BW)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Voltcraft dso-6060c mugshot.png|link=GW Instek GDS-800 series|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[GW Instek GDS-800 series]] (2ch, 25GS/s, 60-250MHz BW)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Hameg HMO2024.png|link=Hameg HMO compact series|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Hameg HMO compact series]] (2-4ch, 2GS/s, 70-200MHz BW)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Hantek DSO-2090.png|link=Hantek DSO-2090|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Hantek DSO-2090]] (2ch, 100MS/s, 40MHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Hung chang dso 2100 mugshot.png|link=Hung-Chang_DSO-2100|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Hung-Chang DSO-2100]] (2ch, 100MS/s, 30MHz BW)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Rigol DS1052E.png|link=Rigol DS1000 series|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Rigol DS1000 series|Rigol DS1000E series]] (2ch, 1GS/s, 50-150MHz BW)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Rigol DS1074Z front.png|link=Rigol DS1000Z series|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Rigol DS1000Z series|Rigol DS1000Z series]] (4ch, 1GS/s, 50-100MHz BW)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Rigol-ds2072 mugshot.png|link=Rigol DS2000 series|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Rigol DS2000 series]] (2ch, 2GS/s, 70-200MHz BW)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Rigol_VS5202D.png|link=Rigol VS5000 series|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Rigol VS5000 series]] (2ch, 20-200MHz BW)&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:Hantek dso2250 mugshot.png|link=Hantek DSO-2250|[[File:Nuvola Orange.png|16px]] &amp;lt;small&amp;gt;[[Hantek DSO-2250]] (2ch, 250MS/s, 100MHz BW)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Hantek dso-5200a device front.png|link=Hantek DSO-5200A|[[File:Nuvola Orange.png|16px]] &amp;lt;small&amp;gt;[[Hantek DSO-5200A]] (2ch, 250MS/s, 200MHz BW)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:OsciPrime.png|link=Nexus-Computing OsciPrime|[[File:Nuvola Orange.png|16px]] &amp;lt;small&amp;gt;[[Nexus-Computing OsciPrime]] (2ch, ?MS/s, 3.3MHz-8MHz BW)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Velleman PCSU1000.png|link=Velleman PCSU1000|[[File:Nuvola Orange.png|16px]] &amp;lt;small&amp;gt;[[Velleman PCSU1000]] (2ch, 1GS/s, 50MHz BW)&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:Fluke scopemeter123.png|link=Fluke ScopeMeter 123|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Fluke ScopeMeter 123]] (2ch, 25MS/s, 20MHz BW)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Focussz_fosc21_mugshot.png|link=Focussz Fosc21|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Focussz Fosc21]] (2ch, 8kS/s, 3kHz BW)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Hantek 6022be.jpg|link=Hantek 6022BE|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Hantek 6022BE]] (2ch, 48MS/s, 20MHz BW)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Hantek front.jpg|link=Hantek 6052BE|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Hantek 6052BE]] (2ch, 150MS/s, 50MHz BW)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Sigrok_logo_no_text_transparent_512.png|link=Hantek DSO-1200|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Hantek DSO-1200]] (2ch, 500MS/s, 200MHz BW)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Usbduxfast.png|link=Incite Technology USB-DUXfast|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Incite Technology USB-DUXfast]] (16ch, 3MHz, ? BW)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Sigrok_logo_no_text_transparent_512.png|link=Owon SDS series|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Owon SDS series]] (2ch, 0.5-3.2GS/s, 60-300MHz BW)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Picoscope 2203.png|link=Pico Technology PicoScope 2203|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Pico Technology PicoScope 2203]] (40/20MS/s, 5MHz BW)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:PicoScope_2205.png|link=Pico Technology PicoScope 2205|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Pico Technology PicoScope 2205]] (200/100MS/s, 25MHz BW)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Picoscope 3206.png|link=Pico Technology PicoScope 3206|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Pico Technology PicoScope 3206]] (200/100MS/s, 200MHz BW)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Picoscope 5203.png|link=Pico Technology PicoScope 5203|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Pico Technology PicoScope 5203]] (1/0.5GS/s, 250MHz BW)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Tektronix tds2024b mugshot.png|link=Tektronix TDS2000B series|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Tektronix TDS2000B series]] (2-4ch, 1-2GS/s, 60-200MHz BW)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:UNI-T UTD2042C.png|link=UNI-T UTD2042C|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[UNI-T UTD2042C]] (2ch, 500MS/s, 40MHz BW)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:VellemanWFS210.png|link=Velleman WFS210|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Velleman WFS210]] (2ch, 10MS/s, ?? MHz BW)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Voltcraft dso-220 usb.png|link=Voltcraft DSO-220|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Voltcraft DSO-220]] (2ch, 60MS/s, 20MHz BW)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Voltcraft DSO-3062C.png|link=Voltcraft DSO-3062C|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Voltcraft DSO-3062C]] (2ch, 1GS/s, 60MHz BW)&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Multimeters ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;100px&amp;quot; heights=&amp;quot;100px&amp;quot;&amp;gt;&lt;br /&gt;
File:Agilent U1232A.png|link=Agilent U12xxx series|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Agilent U12xxx series]] (USB/Bluetooth)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Bbc gm m2110 mugshot.png|link=BBC Goertz Metrawatt M2110|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[BBC Goertz Metrawatt M2110]] (30000 counts, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Brymen BM257.png|link=Brymen BM257|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Brymen BM257]] (6000 counts, RS232/USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Brymen bm257s mugshot.png|link=Brymen BM257s|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Brymen BM257s]] (6000 counts, RS232/USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Bm_857_mugshot_500000.png|link=Brymen BM857|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Brymen BM857]] (50000 counts, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Bm869_mugshot.png|link=Brymen BM869|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Brymen BM869]] (50000 counts, USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Digitek_dt4000zc_device_front.png|link=Digitek DT4000ZC|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Digitek DT4000ZC]] (4000 counts, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Fluke 187.png|link=Fluke 187/189|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Fluke 187/189]] (50000 counts, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Fluke 287.png|link=Fluke 287/289|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Fluke 287/289]] (50000 counts, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Gmc metrahit 14a logo.png|link=Gossen Metrawatt Metrahit 14A|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Gossen Metrawatt Metrahit 14A]] (3100 counts, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Gossen Metrawatt Metrahit 16I small.png|link=Gossen Metrawatt Metrahit 16I|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Gossen Metrawatt Metrahit 16I]] (3100 counts, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Gossen Metrawatt Metrahit 18S small.png|link=Gossen Metrawatt Metrahit 18S|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Gossen Metrawatt Metrahit 18S]] (31000 counts, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Gossen Metrawatt Metrahit 25S Logo.png|link=Gossen Metrawatt Metrahit 25S|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Gossen Metrawatt Metrahit 25S]] (31000 counts, RS232/USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Gmc kmm2002 logo.png|link=Gossen Metrawatt T-Com KMM2002|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Gossen Metrawatt T-Com KMM2002]] (3100 counts, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Gmc metrahit 29s logo.png|link=Gossen Metrawatt Metrahit 29S|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Gossen Metrawatt Metrahit 29S]] (310000 counts, RS232/USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:HT410 logo.png|link=HT Instruments HT410|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[HT Instruments HT410]] (3100 counts, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:100px_Idm103n.png|link=ISO-TECH IDM103N|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[ISO-TECH IDM103N]] (4000 counts, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Mastech mas345 device front.png|link=MASTECH MAS345|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[MASTECH MAS345]] (4000 counts, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Mastech ms8250b mugshot.png|link=MASTECH MS8250B|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[MASTECH MS8250B]] (4000 counts, USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Metex m4650cr mugshot.png|link=Metex M-4650CR|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Metex M-4650CR]] (20000 counts, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Metex_me-31.png|link=Metex ME-31|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Metex ME-31]] (4000 counts, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Norma dm950.png|link=Norma DM950|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Norma DM950]] (21000 counts, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Pce-pce-dm32.png|link=PCE PCE-DM32|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[PCE PCE-DM32]] (4000 counts, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Metex_me-31.png|link=PeakTech 3410|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[PeakTech 3410]] (4000 counts, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Peaktech 4370 device front.png|link=PeakTech 4370|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[PeakTech 4370]] (2000 counts, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Rs_22_168_mugshot.png|link=RadioShack 22-168|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[RadioShack 22-168]] (2000 counts, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Rs_22-805_front.png|link=RadioShack 22-805|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[RadioShack 22-805]] (4000 counts, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:radioshack_22_812_front.png|link=RadioShack 22-812|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[RadioShack 22-812]] (4000 counts, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:siemens_b1026_logo.png|link=Siemens B1026|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Siemens B1026]] (21000 counts, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Siemens B1105 small.png|link=Siemens B1105|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Siemens B1105]] (310000 counts, RS232/USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Tecpel dmm8061.png|link=Tecpel DMM-8061|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Tecpel DMM-8061]] (4000 counts, RS232/USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Tp4000zc_front.png|link=TekPower TP4000ZC|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[TekPower TP4000ZC]] (4000 counts, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Tenma 72-7745.png|link=Tenma 72-7745|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Tenma 72-7745]] (4000 counts, RS232/USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Ut60e_-_front_-_alpha.png|link=UNI-T UT60E|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[UNI-T UT60E]] (4000 counts, RS232/USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Uni-t ut61b mugshot.png|link=UNI-T UT61B|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[UNI-T UT61B]] (4000 counts, RS232/USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Uni-t ut61c mugshot.png|link=UNI-T UT61C|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[UNI-T UT61C]] (6000 counts, RS232/USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Uni t ut61d device.png|link=UNI-T UT61D|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[UNI-T UT61D]] (6000 counts, RS232/USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Old ver front.png|link=UNI-T UT61E|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[UNI-T UT61E]] (22000 counts, RS232/USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Ut71c mugshot.png|link=UNI-T UT71C|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[UNI-T UT71C]] (40000 counts, RS232/USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Va_va18b.png|link=V&amp;amp;A VA18B|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[V&amp;amp;A VA18B]] (6000 counts, USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Va va40b mugshot.png|link=V&amp;amp;A VA40B|link=V&amp;amp;A VA40B|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[V&amp;amp;A VA40B]] (6000 counts, USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:DVM4100.png|link=Velleman DVM4100|link=Velleman DVM4100|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Velleman DVM4100]] (6000 counts, USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Victor 70C.png|link=Victor 70C|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Victor 70C]] (4000 counts, USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Victor 86c device front.png|link=Victor 86C|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Victor 86C]] (4000 counts, USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Voltcraft m-3650cr.png|link=Voltcraft M-3650CR|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Voltcraft M-3650CR]] (2000 counts, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Voltcraft_M-3650D_transparent.png|link=Voltcraft M-3650D|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Voltcraft M-3650D]] (2000 counts, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Voltcraft m4650cr.png|link=Voltcraft M-4650CR|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Voltcraft M-4650CR]] (20000 counts, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Voltcraft ME-42 logo.png|link=Voltcraft ME-42|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Voltcraft ME-42]] (4000 counts, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Voltcraft vc820 device.png|link=Voltcraft VC-820|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Voltcraft VC-820]] (4000 counts, RS232/USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Voltcraft vc830.png|link=Voltcraft VC-830|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Voltcraft VC-830]] (6000 counts, RS232/USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Voltcraft vc840 device front.png|link=Voltcraft VC-840|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Voltcraft VC-840]] (4000 counts, RS232/USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Voltcraft vc920.png|link=Voltcraft VC-920|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Voltcraft VC-920]] (40000/4000 counts, RS232/USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Voltcraft vc940.png|link=Voltcraft VC-940|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Voltcraft VC-940]] (40000/4000 counts, RS232/USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:Tenma 72-1016.png|link=Tenma 72-1016|[[File:Nuvola Orange.png|16px]] &amp;lt;small&amp;gt;[[Tenma 72-1016]] (6000 counts, RS232/USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Tenma 72-7730.png|link=Tenma 72-7730|[[File:Nuvola Orange.png|16px]] &amp;lt;small&amp;gt;[[Tenma 72-7730]] (20000 counts, RS232/USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Tenma 72-7732.png|link=Tenma 72-7732|[[File:Nuvola Orange.png|16px]] &amp;lt;small&amp;gt;[[Tenma 72-7732]] (40000 counts, RS232/USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Tenma 72-7750.png|link=Tenma 72-7750|[[File:Nuvola Orange.png|16px]] &amp;lt;small&amp;gt;[[Tenma 72-7750]] (6000 counts, RS232/USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Tenma 72-9380A.png|link=Tenma 72-9380A|[[File:Nuvola Orange.png|16px]] &amp;lt;small&amp;gt;[[Tenma 72-9380A]] (40000 counts, RS232/USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:Appa 107.png|link=APPA 107|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[APPA 107]] (4000 / 20000 counts, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Digitek dt8000.png|link=Digitek DT8000|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Digitek DT8000]] (8000 counts, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Digitek dt80000.png|link=Digitek DT80000|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Digitek DT80000]] (80000 counts, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Escort 179 device front.png|link=Escort 179|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Escort 179]] (10000 counts, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Gossen metrahit 30m.png|link=Gossen-Metrawatt METRAHIT 30M|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Gossen-Metrawatt METRAHIT 30M]] (1200000 counts, RS232/USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Sigrok_logo_no_text_transparent_512.png|link=HYELEC MS8236|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[HYELEC MS8236]] (6000 counts, USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:800px-Mastech m9803r device front.png|link=MASTECH M9803R|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[MASTECH M9803R]] (4000 counts, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Metrix mx53.png|link=Metrix MX53|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Metrix MX53]] (50000 counts, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Metrix mx56c.png|link=Metrix MX56C|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Metrix MX56C]] (50000 counts, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Peaktech 4380 mugshot.png|link=PeakTech 4380|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[PeakTech 4380]] (4000 counts, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Sigrok_logo_no_text_transparent_512.png|link=Protek 6500|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Protek 6500]] (50000 counts, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Rigol DM3068 front.png|link=Rigol DM3068|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Rigol DM3068]] (2200000 counts, LAN/USB/GPIB/RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Voltcraft m3890dt usb.png|link=Voltcraft M-3890DT|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Voltcraft M-3890DT]] (4000 counts, USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Voltcraft m4660a device front.png|link=Voltcraft M-4660A|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Voltcraft M-4660A]] (20000 counts, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Sigrok_logo_no_text_transparent_512.png|link=Voltcraft VC-870|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Voltcraft VC-870]] (40000 counts, RS232/USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== LCR meters ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;100px&amp;quot; heights=&amp;quot;100px&amp;quot;&amp;gt;&lt;br /&gt;
File:Voltcraft4080_2.png|link=Voltcraft 4080|[[File:Nuvola Orange.png|16px]] &amp;lt;small&amp;gt;[[Voltcraft 4080]] (serial)&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sound level meters ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;100px&amp;quot; heights=&amp;quot;100px&amp;quot;&amp;gt;&lt;br /&gt;
File:CEM DT-8852.png|link=CEM DT-8852|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[CEM DT-8852]] (USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Colead SL-5868P.png|link=Colead SL-5868P|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Colead SL-5868P]] (RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Kecheng KC-330B.png|link=Kecheng KC-330B|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Kecheng KC-330B]] (RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Tondaj sl-814.png|link=Tondaj SL-814|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Tondaj SL-814]] (USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Voltcraft_DL-161S.png|link=Voltcraft DL-161S|[[File:Nuvola Orange.png|16px]] &amp;lt;small&amp;gt;[[Voltcraft DL-161S]] (USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Pce_pce-222_front.png|link=PCE PCE-222|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[PCE PCE-222]] (also: light-/thermo-/hygrometer; RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Voltcraft_dl_160s.png|link=Voltcraft DL-160S|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Voltcraft DL-160S]] (USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Thermometers ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;100px&amp;quot; heights=&amp;quot;100px&amp;quot;&amp;gt;&lt;br /&gt;
File:rs55ii.png|link=APPA 55II|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[APPA 55II]] (2xtemp, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:EL-USB-2.png|link=Lascar Electronics EL-USB-2|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Lascar Electronics EL-USB-2]] (1xtemp, 1xhum, USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Mic 98581.png|link=MIC 98581|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[MIC 98581]] (1xtemp, USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Mic 98583.png|link=MIC 98583|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[MIC 98583]] (1xtemp, 1xhum, USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Uni-t ut325 front.png|link=UNI-T UT325|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[UNI-T UT325]] (2xtemp, USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Voltcraft k204.png|link=Voltcraft K204|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Voltcraft K204]] (4xtemp, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Elitech rc3.png|link=Elitech RC-3|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Elitech RC-3]] (1xtemp, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Escort 19.png|link=Escort 19|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Escort 19]] (1x temp, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Pce_pce-222_front.png|link=PCE PCE-222|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[PCE PCE-222]] (1xtemp, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Rding temper front.png|link=RDing TEMPer|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[RDing TEMPer]] (1xtemp, USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Rding temper gold device front.png|link=RDing TEMPer Gold|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[RDing TEMPer Gold]] (1xtemp, USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Rding temper1 device front.png|link=RDing TEMPer1|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[RDing TEMPer1]] (1xtemp, USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Pcsensor_temper1k2.png|link=RDing TEMPer1K2|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[RDing TEMPer1K2]] (1xtemp, USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Voltcraft dl-120th.png|link=Voltcraft DL-120TH|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Voltcraft DL-120TH]] (1xtemp, USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Voltcraft dl-140th.png|link=Voltcraft DL-140TH|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Voltcraft DL-140TH]] (1xtemp, USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hygrometers ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;100px&amp;quot; heights=&amp;quot;100px&amp;quot;&amp;gt;&lt;br /&gt;
File:EL-USB-2.png|link=Lascar Electronics EL-USB-2|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Lascar Electronics EL-USB-2]] (temp/humidity, USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Mic 98583.png|link=MIC 98583|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[MIC 98583]] (temp/humidity, USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Pce_pce-222_front.png|link=PCE PCE-222|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[PCE PCE-222]] (also: light-/soundlevelmeter; RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Silabs si7005usb dgl eb top.jpg|link=SiLabs Si7005USB-Dongle|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[SiLabs Si7005USB-Dongle]] (USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Anemometers ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;100px&amp;quot; heights=&amp;quot;100px&amp;quot;&amp;gt;&lt;br /&gt;
File:Mastech ms6252b.png|link=MASTECH MS6252B|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[MASTECH MS6252B]] (USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Light meters ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;100px&amp;quot; heights=&amp;quot;100px&amp;quot;&amp;gt;&lt;br /&gt;
File:Lutron YK-2005LX.png|link=Lutron YK-2005LX|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Lutron YK-2005LX]] (RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Pce_pce-222_front.png|link=PCE PCE-222|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[PCE PCE-222]] (RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Energy meters ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;100px&amp;quot; heights=&amp;quot;100px&amp;quot;&amp;gt;&lt;br /&gt;
File:Actaris_a14c5_teleinfo.png|link=EDF Teleinfo|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[EDF Teleinfo]] (RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Acme.png|link=BayLibre ACME|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[BayLibre ACME]] (I2C)&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== DAQs ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;100px&amp;quot; heights=&amp;quot;100px&amp;quot;&amp;gt;&lt;br /&gt;
File:Ni usb 6008.png|link=NI USB-6008|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[NI USB-6008]] (8/2 analog inputs/outputs, 12 digital I/Os)&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Dataloggers ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;100px&amp;quot; heights=&amp;quot;100px&amp;quot;&amp;gt;&lt;br /&gt;
File:EL-USB-CO.png|link=Lascar Electronics EL-USB-CO|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Lascar Electronics EL-USB-CO]] (carbon monoxide (CO) logger, USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Testo_435-4.png|link=Testo 435-4|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Testo 435-4]] (USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Gsg_indoor_air_monitor.png|link=GSG Indoor Air Monitor|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[GSG Indoor Air Monitor]] (air quality monitor, USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Maul_studio_i.png|link=MAUL studio i|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[MAUL studio i]] (weighing scale, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Voltcraft co-20.png|link=Voltcraft CO-20|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Voltcraft CO-20]] (air quality monitor, USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tachometers ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;100px&amp;quot; heights=&amp;quot;100px&amp;quot;&amp;gt;&lt;br /&gt;
File:Uni-t ut372 mugshot.png|link=UNI-T UT372|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[UNI-T UT372]] (USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Scales ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;100px&amp;quot; heights=&amp;quot;100px&amp;quot;&amp;gt;&lt;br /&gt;
File:Kern ew-6200-2nm mugshot.png|link=KERN scale series|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[KERN scale series]] (RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Digital loads ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;100px&amp;quot; heights=&amp;quot;100px&amp;quot;&amp;gt;&lt;br /&gt;
File:Maynuo m9812 mugshot.png|link=Maynuo M9812|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Maynuo M9812]]&lt;br /&gt;
File:Atten ATZ9711.png|link=ATTEN ATZ9711|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[ATTEN ATZ9711]]&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Function generators ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;100px&amp;quot; heights=&amp;quot;100px&amp;quot;&amp;gt;&lt;br /&gt;
File:Hantek DDS-3X25 top.png|link=Hantek DDS-3X25|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Hantek DDS-3X25]] (25MHz, PC-based, USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Siglent sdg1010 device front 8116.png|link=Siglent SDG1010|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Siglent SDG1010]] (10MHz, USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:BG7TBL small.png|link=BG7TBL|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[BG7TBL]] (138MHz-4.4GHz, PC-based, USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:MHINSTEK UDB1305S persp.jpg|link=MHINSTEK UDB1xxxS|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[MHINSTEK UDB1xxxS]] (2/5/8MHz, Serial)&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== RF receivers ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;100px&amp;quot; heights=&amp;quot;100px&amp;quot;&amp;gt;&lt;br /&gt;
File:Per vices noctar.png|link=Per Vices Noctar|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Per Vices Noctar]] (100kHz-4GHz, IQ modulator/demodulator, PCIe)&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Spectrum analyzers ==&lt;br /&gt;
&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
== Power supplies ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;100px&amp;quot; heights=&amp;quot;100px&amp;quot;&amp;gt;&lt;br /&gt;
File:Atten PPS3203T-3S.png|link=Atten PPS3203T-3S|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Atten PPS3203T-3S]] (3ch, 2x 0-32V, 1x 0-6V at 0-3A, USB&amp;amp;RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Chroma_61604_front.png|link=Chroma 61604|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Chroma 61604]] (1ch, 0-300V, 0-16A, 2kVA)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Conrad_digi_35_cpu_logo.png|link=Conrad DIGI 35 CPU|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Conrad DIGI 35 CPU]] (1ch, 0-35V/0-2.55A, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:HP-6632B_mugshot.png|link=HP 6632B|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[HP 6632B]] (1ch, 0-20V/0-5A, GPIB&amp;amp;RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Velleman ps3005d mugshot.png|link=Korad KDxxxxP series|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Korad KDxxxxP series]] (1ch, 0-30V/0-5A, USB&amp;amp;RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Manson hcs3202.png|link=Manson HCS-3202|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Manson HCS-3202]] (1ch, 1-36V/0-10A, USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Motech_LPS-301_logo.png|link=Motech LPS-301|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Motech LPS-301]] (1ch, 1-32V/0-2A, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Philips PM2813.png|link=Philips PM2800 series|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;Fluke/Philips PM2800 series&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Rigol DP832.png|link=Rigol DP800 series|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Rigol DP800 series]]&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Voltcraft pps-11815 logo.png|link=Voltcraft PPS-11815|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Voltcraft PPS-11815]] (1ch, 0-60V/0-5A, USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:Sigrok logo no text transparent 512.png|link=Voltcraft 18220|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Voltcraft 18220]] (1ch, 0-40V/0-5A, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== GPIB interfaces ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;100px&amp;quot; heights=&amp;quot;100px&amp;quot;&amp;gt;&lt;br /&gt;
File:Beiming_s82357.png|link=Beiming S82357|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Beiming S82357]] (hardware-based, USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:ICS 488-USB.png|link=ICS 488-USB|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[ICS 488-USB]] (hardware-based, USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:GPIB-USB 82357B clone.png|link=GPIB-USB 82357B clone|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[GPIB-USB 82357B clone]] (hardware-based, USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:NI GPIB-ENET.png|link=National Instruments GPIB-ENET|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[National Instruments GPIB-ENET]] (hardware-based, Ethernet)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:NI GPIB-USB-HS.png|link=National Instruments GPIB-USB-HS|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[National Instruments GPIB-USB-HS]] (hardware-based, USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Prologix-usb.png|link=Prologix GPIB-USB|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Prologix GPIB-USB]] (firmware-based, USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:GalvantGPIBUSBrev4.JPG|link=Galvant GPIBUSB|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Galvant GPIBUSB]] (firmware-based, USB, OSHW)&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Potential other candidates ==&lt;br /&gt;
&lt;br /&gt;
If you own any other logic analyzers, oscilloscopes, multimeters, dataloggers, ... and want to add support for them in sigrok (or donate/lend devices to developers), please let us know. We&amp;#039;re always happy to add more hardware support! Join the [https://lists.sourceforge.net/lists/listinfo/sigrok-devel mailing list] or ask on [irc://chat.freenode.net/sigrok IRC #sigrok] if you want to help out.&lt;br /&gt;
&lt;br /&gt;
__FORCETOC__&lt;/div&gt;</summary>
		<author><name>Danielk</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=Sysclk_LWLA1016&amp;diff=11273</id>
		<title>Sysclk LWLA1016</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=Sysclk_LWLA1016&amp;diff=11273"/>
		<updated>2015-11-28T14:40:38Z</updated>

		<summary type="html">&lt;p&gt;Danielk: Device is now supported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox logic analyzer&lt;br /&gt;
| image            = [[File:Sysclk lwla1016.png|180px]]&lt;br /&gt;
| name             = Sysclk LWLA1016&lt;br /&gt;
| status           = supported&lt;br /&gt;
| source_code_dir  = sysclk-lwla&lt;br /&gt;
| channels         = 16/8&lt;br /&gt;
| samplerate       = 100/200/250 MHz&lt;br /&gt;
| samplerate_state = ?&lt;br /&gt;
| triggers         = only in 100MHz mode&lt;br /&gt;
| voltages         = ?&lt;br /&gt;
| threshold        = ?&lt;br /&gt;
| memory           = 512Kbit/channel, or 256Kbit/channel with RLE&lt;br /&gt;
| compression      = optional RLE&lt;br /&gt;
| website          = [http://item.taobao.com/item.htm?id=12821371102 taobao.com]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
The &amp;#039;&amp;#039;&amp;#039;Sysclk LWLA1016&amp;#039;&amp;#039;&amp;#039; is a USB-based, 16-channel logic analyzer with up to 100MHz sampling rate, or up to 250MHz with 8 channels.&lt;br /&gt;
&lt;br /&gt;
Note that sigrok supports only the 100 MHz mode with 16 channels. Supporting the 200/250 MHz 8 channel modes is not worth the effort, since the device does not support triggers in these modes. A non-streaming device without triggers is pretty much useless for any real world application.&lt;br /&gt;
&lt;br /&gt;
See [[Sysclk LWLA1016/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;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
== Photos ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Sysclk lwla1016 front.jpg|&amp;lt;small&amp;gt;Device, front&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Sysclk lwla1016 device back.jpg|&amp;lt;small&amp;gt;Device, back&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Sysclk lwla1016 device open.jpg|&amp;lt;small&amp;gt;Device, open&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Sysclk lwla1016 pcb top.jpg|&amp;lt;small&amp;gt;PCB, top&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Sysclk lwla1016 pcb bottom.jpg|&amp;lt;small&amp;gt;PCB, bottom&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Sysclk lwla1016 pcb cypress fx2.jpg|&amp;lt;small&amp;gt;Cypress FX2&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Sysclk lwla1016 pcb issi 1.jpg|&amp;lt;small&amp;gt;ISSI 1&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Sysclk lwla1016 pcb issi2.jpg|&amp;lt;small&amp;gt;ISSI 2&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Sysclk lwla1016 pcb atmlh105.jpg|&amp;lt;small&amp;gt;ATMLH105&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Sysclk lwla1016 stc 15f104e.jpg|&amp;lt;small&amp;gt;STC&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Sysclk lwla1016 pcb ldo.jpg|&amp;lt;small&amp;gt;LDOs&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Sysclk lwla1016 pcb input.jpg|&amp;lt;small&amp;gt;Input stage&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Sysclk lwla1016 pcb crystal.jpg|&amp;lt;small&amp;gt;Crystal&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Protocol ==&lt;br /&gt;
&lt;br /&gt;
Reverse engineering of the vendor&amp;#039;s custom protocol is complete. See [[Sysclk LWLA1016/Protocol]] for the findings gathered.&lt;br /&gt;
&lt;br /&gt;
== Resources ==&lt;br /&gt;
&lt;br /&gt;
TODO.&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>Danielk</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=Sysclk_LWLA1034/Protocol&amp;diff=11201</id>
		<title>Sysclk LWLA1034/Protocol</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=Sysclk_LWLA1034/Protocol&amp;diff=11201"/>
		<updated>2015-10-31T01:00:28Z</updated>

		<summary type="html">&lt;p&gt;Danielk: Document capture control bits&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== FPGA Configuration ==&lt;br /&gt;
&lt;br /&gt;
The FPGA bitstream is loaded via bulk transfer to USB end point 4. Each firmware transfer starts with a 4-byte header to announce the transfer size. The payload appears to be a Raw Binary File (.rbf) with compression enabled.&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;
!Length&lt;br /&gt;
!Payload...&lt;br /&gt;
|-&lt;br /&gt;
| nnnn-nnnn&lt;br /&gt;
| dd...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Unlike the control commands, the firmware transfer is apparently byte-based. The length is a byte count encoded in big endian (1-2-3-4) byte order, and includes the size of the length field (4 bytes) itself.&lt;br /&gt;
&lt;br /&gt;
=== Application Behavior ===&lt;br /&gt;
&lt;br /&gt;
The vendor software transfers a new bitstream to the FPGA&lt;br /&gt;
# on application start,&lt;br /&gt;
# when switching clocking mode between internal, external/rising or external/falling,&lt;br /&gt;
# on application exit.&lt;br /&gt;
&lt;br /&gt;
The size of the bitstream varies due to compression, but is in the order of 50kB to 80kB. The firmware transfer is split by the vendor software into packets with 15 byte payload each and thus takes quite a bit of time inside VirtualBox. Testing with a libusb-based tool for issuing USB bulk transfers has shown that this does not appear to be necessary: Transferring even the entire firmware blob in a single bulk transfer appears to work without error.&lt;br /&gt;
=== Firmware Extraction ===&lt;br /&gt;
&lt;br /&gt;
The firmware blobs can be extracted directly from the Windows installer executable located on the CD-ROM that ships with the device.  The file &amp;lt;tt&amp;gt;lwla1034_EN_setup.exe&amp;lt;/tt&amp;gt; on the CD-ROM from 2012-07-12 has the firmware blobs located at the following offsets:&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;
!Offset&lt;br /&gt;
!Length&lt;br /&gt;
!Mode&lt;br /&gt;
|-&lt;br /&gt;
| 34110338&lt;br /&gt;
| 78398&lt;br /&gt;
| Internal clock&lt;br /&gt;
|-&lt;br /&gt;
| 34266237&lt;br /&gt;
| 78247&lt;br /&gt;
| External clock (rising edge)&lt;br /&gt;
|-&lt;br /&gt;
| 34344484&lt;br /&gt;
| 79145&lt;br /&gt;
| External clock (falling edge)&lt;br /&gt;
|-&lt;br /&gt;
| 34578631&lt;br /&gt;
| 48525&lt;br /&gt;
| Shutdown&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Both offsets and lengths are in bytes. The extracted blobs already include the header with the 32-bit length field.&lt;br /&gt;
&lt;br /&gt;
== Control Commands ==&lt;br /&gt;
&lt;br /&gt;
Control commands are sent via bulk transfer to USB end point 2, with the response (if any) coming in from end point 6.&lt;br /&gt;
&lt;br /&gt;
Command messages are sent to the device as a sequence of 16-bit words with little endian byte order. The first word in a message identifies the command type. Different command types have different message lengths. Some command types include a length field and allow for messages of variable length, others are of fixed size.&lt;br /&gt;
&lt;br /&gt;
There are read commands which trigger an immediate response from the device, and write commands without a response.&lt;br /&gt;
&lt;br /&gt;
=== Command 0001: Read Register ===&lt;br /&gt;
&lt;br /&gt;
This command reads a 32-bit wide control register.&lt;br /&gt;
&lt;br /&gt;
==== Command ====&lt;br /&gt;
&lt;br /&gt;
Fixed length of 2 words (4 bytes).&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;
!ID&lt;br /&gt;
!Address&lt;br /&gt;
|-&lt;br /&gt;
| 0001&lt;br /&gt;
| aaaa&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Response ====&lt;br /&gt;
&lt;br /&gt;
The response has a fixed length of 2 words (4 bytes). It is the content of a 32-bit register in mixed endian (2-1-4-3) byte order.&lt;br /&gt;
&lt;br /&gt;
=== Command 0002: Write Register ===&lt;br /&gt;
&lt;br /&gt;
This command writes a 32-bit value to a control register.&lt;br /&gt;
&lt;br /&gt;
==== Command ====&lt;br /&gt;
&lt;br /&gt;
Fixed length of 4 words (8 bytes).&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;
!ID&lt;br /&gt;
!Address&lt;br /&gt;
!Data&lt;br /&gt;
|-&lt;br /&gt;
| 0002&lt;br /&gt;
| aaaa&lt;br /&gt;
| dddd-dddd&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The value is encoded in mixed endian (2-1-4-3) byte order.&lt;br /&gt;
&lt;br /&gt;
=== Command 0005: Copy Protection Check ===&lt;br /&gt;
&lt;br /&gt;
This command writes 16 32-bit words which are then verified by the device for copy protection purposes. The vendor software issues this after a transfer of captured data to the host has finished, but only for the first three captures.&lt;br /&gt;
&lt;br /&gt;
The values are apparently obtained by scrambling and/or hashing the captured data. The device functions correctly even without ever sending this command. For this reason, the LWLA1034 firmware distributed with sigrok implements the copy protection in the FPGA instead.&lt;br /&gt;
&lt;br /&gt;
==== Command ====&lt;br /&gt;
&lt;br /&gt;
Fixed length of 33 words (66 bytes).&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;
!ID&lt;br /&gt;
!Data 1&lt;br /&gt;
!Data 2&lt;br /&gt;
!...&lt;br /&gt;
!Data 16&lt;br /&gt;
|-&lt;br /&gt;
| 0005&lt;br /&gt;
| dddd-dddd&lt;br /&gt;
| dddd-dddd&lt;br /&gt;
| ...&lt;br /&gt;
| dddd-dddd&lt;br /&gt;
|}&lt;br /&gt;
The byte order of each 32-bit word is the usual 2-1-4-3 mixed endianess. It appears that the three high bytes of each word are always zero.&lt;br /&gt;
&lt;br /&gt;
=== Command 0006: Read Memory at Address ===&lt;br /&gt;
&lt;br /&gt;
This command reads a chunk of data from the device memory (SRAM). It allows for random access using a 32-bit start address, and for variable length via a 32-bit length field. The software uses this command to read captured data from the device&amp;#039;s buffer.&lt;br /&gt;
&lt;br /&gt;
==== Command ====&lt;br /&gt;
&lt;br /&gt;
Fixed length of 5 words (10 bytes).&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;
!ID&lt;br /&gt;
!Address&lt;br /&gt;
!Length&lt;br /&gt;
|-&lt;br /&gt;
| 0006&lt;br /&gt;
| aaaa-aaaa&lt;br /&gt;
| nnnn-nnnn&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Both the address and the length are encoded in mixed endian (2-1-4-3) byte order.&lt;br /&gt;
&lt;br /&gt;
==== Response ====&lt;br /&gt;
&lt;br /&gt;
The memory is 36 bit wide, and thus the size of the response in bits is 36 times the value in the length field. The original vendor software reads chunks of 120 words @ 36 bit at a time, which works out to an integer multiple of 32 (i.e. 4320 bits = 135 32-bit words or 540 bytes). The final six reads are done in chunks of 8 words @ 36 bit, which works out to nine 32-bit words or 36 bytes. The overall amount of memory being read when fetching captured samples from a full buffer is just below the RAM size of 256k×36 bit.&lt;br /&gt;
&lt;br /&gt;
Note that the software always starts reading at address 4 rather than 0. Presumably, the firmware uses the first four 36-bit words for internal bookkeeping or some other purpose. Exception to the rule: For some unknown reason (perhaps testing), the memory is also being read on start-up right after loading the firmware into the FPGA. In this case, altogether 128000 36-bit words are being read beginning at address 0.&lt;br /&gt;
&lt;br /&gt;
Note that reading more than 1024 bytes at a time seems to be unreliable. Due to the constraints outlined in the following section, the maximum read length should therefore be restricted to 224 device words, which works out to 1008 bytes.&lt;br /&gt;
&lt;br /&gt;
===== 36-to-32 Bit Mapping =====&lt;br /&gt;
&lt;br /&gt;
The data returned by the read command consists of 32-bit words in 2-1-4-3 mixed endian byte order. Eight consecutive 36-bit words from the SRAM are mapped at a time to nine consecutive 32-bit words in the received stream. The first of these slices aligns to the beginning of the read-out stream, apparently irrespective of the absolute start address of the read operation.&lt;br /&gt;
&lt;br /&gt;
The first eight 32-bit words in a slice contain the lower 32 bit of the eight encoded 36-bit words. The ninth 32-bit word contains the four remaining high bits of all eight 36-bit words combined. The high nibbles are shifted into the ninth word from right to left, resulting in a 1-2-3-4-5-6-7-8 order of nibbles. (This is after conversion from mixed endian byte order!)&lt;br /&gt;
&lt;br /&gt;
As it is necessary to access the ninth 32-bit word in each slice even to fully extract the first 36-bit word, it follows that memory reads should always request a multiple of the slice length, i.e. eight 36-bit words. The length of the response will thus always be a multiple of nine 32-bit words (36 bytes). However, it does not appear to be necessary to restrict read operations to only the two lengths 120 and 8 used by the vendor software.&lt;br /&gt;
&lt;br /&gt;
===== Compression Scheme =====&lt;br /&gt;
&lt;br /&gt;
The compression scheme is a form of run-length encoding. Very short run lengths of only one or two cycles are handled as special cases, which helps to keep the worst-case overhead of compression pretty low. In particular, the scheme ensures that it is never necessary to write more than one 36-bit word per sampling cycle to the SRAM buffer.&lt;br /&gt;
&lt;br /&gt;
Each 36-bit word in the stream is either a data word or a repeat half-count word. The first word in the stream is a data word, with the following layout:&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;
!Bit&lt;br /&gt;
!35&lt;br /&gt;
!34&lt;br /&gt;
!33&lt;br /&gt;
!32&lt;br /&gt;
!31&lt;br /&gt;
!...&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
!Meaning&lt;br /&gt;
| Repeat count follows&lt;br /&gt;
| LSB of repeat count&lt;br /&gt;
| CH34&lt;br /&gt;
| CH33&lt;br /&gt;
| CH32&lt;br /&gt;
| ...&lt;br /&gt;
| CH3&lt;br /&gt;
| CH2&lt;br /&gt;
| CH1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
If bit 35 is set, then the next 36-bit word in the stream encodes the number of cycles the previous data word is repeated, divided by two. The actual number of repeat cycles is twice that number plus the LSB of repeat count, i.e. bit 34 from the data word. If bit 35 is not set the next word is again a data word and the repeat half-count is assumed as zero. However, the LSB of repeat count bit still applies; i.e. if it is set then the repeat count would be 1.&lt;br /&gt;
&lt;br /&gt;
So, to recap, repeat counts 0 to 1 are encoded as part of the channel data word, larger repeat counts use up a full extra 36-bit word. The combined repeat count is then 37 bit wide. At 125 MHz, this scheme would allow for encoding run lengths of more than 18 minutes. However, note that the vendor software does not actually make use of the full range: Apparently, it stops as soon as the count rolls over into bit 36, thereby cutting the maximum possible run length in half (i.e. about 9 minutes at 125 MHz). However, this detail does not make any difference for the decompression algorithm.&lt;br /&gt;
&lt;br /&gt;
The next word following a repeat half-count is again a data word. Note that it is possible for a sample/run-length pair to be split across a slice boundary, or even across successive read chunks. The decoder therefore needs to keep track of RLE state across slices as well as read operations.&lt;br /&gt;
&lt;br /&gt;
=== Command 0007: Write Long Registers ===&lt;br /&gt;
&lt;br /&gt;
This command writes several long registers in bulk. The long registers are 64 bit wide and use their own address space separate from the 32-bit control registers.&lt;br /&gt;
&lt;br /&gt;
The vendor software issues this command once during start-up, and once for each capture operation as part of the setup sequence. It is also issued when clicking the Stop button to cancel a capture in progress.&lt;br /&gt;
&lt;br /&gt;
==== Command ====&lt;br /&gt;
&lt;br /&gt;
Variable length of 3 words (6 bytes) plus length × 4 words (8 bytes).&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;
!ID&lt;br /&gt;
!Address&lt;br /&gt;
!Length&lt;br /&gt;
!Data&lt;br /&gt;
!...&lt;br /&gt;
|-&lt;br /&gt;
| 0007&lt;br /&gt;
| aaaa&lt;br /&gt;
| nnnn&lt;br /&gt;
| dddd-dddd-dddd-dddd&lt;br /&gt;
| ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The two argument words are the start address and the length of the slice to write, in little endian byte order. Both the address and the length refer to quantities of 64 bit (4 words or 8 bytes). Thus, if length is 10 the payload should consist of 40 words or 80 bytes.&lt;br /&gt;
&lt;br /&gt;
The vendor software always writes a slice of length 10 beginning at address 0, thus completely resetting both the capture configuration as well as the capture status. See the table of long registers for a description of the configuration and status fields.&lt;br /&gt;
&lt;br /&gt;
=== Command 0008: Read Long Registers ===&lt;br /&gt;
&lt;br /&gt;
This command reads several long registers in bulk. The long registers are 64 bit wide and use their own address space separate from the 32-bit control registers.&lt;br /&gt;
&lt;br /&gt;
The software uses this command mainly to read the block of capture status registers. During idle periods, the original vendor software polls the channel state about 34 times per second for its live port status display. During a capture operation, it is necessary to poll the status in order to find out whether the capture buffer has been filled completely and samples can be retrieved.&lt;br /&gt;
&lt;br /&gt;
==== Command ====&lt;br /&gt;
&lt;br /&gt;
Fixed length of 3 words (6 bytes).&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;
!ID&lt;br /&gt;
!Address&lt;br /&gt;
!Length&lt;br /&gt;
|-&lt;br /&gt;
| 0008&lt;br /&gt;
| aaaa&lt;br /&gt;
| nnnn&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The two argument words are the start address and the length of the slice to read, in little endian byte order. Both the address and the length refer to quantities of 64 bit (4 words or 8 bytes). Thus, if length is 10 the reply will consist of 40 words or 80 bytes.&lt;br /&gt;
&lt;br /&gt;
Although the vendor software always reads the full 10 fields of configuration and status information, it does not seem to be an actual requirement. Restricting reads to fields 5 to 9 in the sigrok driver works fine so far without any problems.&lt;br /&gt;
&lt;br /&gt;
==== Response ====&lt;br /&gt;
&lt;br /&gt;
Each returned 64-bit word is in very much mixed up (6-5-8-7-2-1-4-3) byte order. See the table of long registers for the meaning of the values at each address.&lt;br /&gt;
&lt;br /&gt;
== Control Registers ==&lt;br /&gt;
&lt;br /&gt;
The device exposes a number of 32-bit wide registers accessed via commands 1 and 2. Some of the register addresses appearing in the protocol also occur in the LWLA1016 protocol, although it seems that their purpose may not be the same. Other registers appear to be specific to the LWLA1034.&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;
!Address&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
| 1074&lt;br /&gt;
| MEM_CTRL&lt;br /&gt;
| Control register for capture memory access.&lt;br /&gt;
|-&lt;br /&gt;
| 1078&lt;br /&gt;
| MEM_FILL&lt;br /&gt;
| Compressed size of captured data (number of 36-bit words).&lt;br /&gt;
|-&lt;br /&gt;
| 107C&lt;br /&gt;
| MEM_ADDR?&lt;br /&gt;
| Not clear if this is an address or another control register, or even if it is needed at all.&lt;br /&gt;
|-&lt;br /&gt;
| 1090&lt;br /&gt;
| TEST?&lt;br /&gt;
| Writing 1 to this register apparently enables some sort of test mode.&lt;br /&gt;
|-&lt;br /&gt;
| 1094&lt;br /&gt;
| DIV_BYPASS&lt;br /&gt;
| This is set to 0 when using the internal clock with sampling rates of 100 MHz and below. For 125 MHz internal clock or the external clock modes, it is set to 1.&lt;br /&gt;
|-&lt;br /&gt;
| 10B0&lt;br /&gt;
| LONG_STROBE&lt;br /&gt;
| Long register read/write strobe.&lt;br /&gt;
|-&lt;br /&gt;
| 10B4&lt;br /&gt;
| LONG_ADDR&lt;br /&gt;
| Long register address.&lt;br /&gt;
|-&lt;br /&gt;
| 10B8&lt;br /&gt;
| LONG_LOW&lt;br /&gt;
| Long register low word.&lt;br /&gt;
|-&lt;br /&gt;
| 10BC&lt;br /&gt;
| LONG_HIGH&lt;br /&gt;
| Long register high word.&lt;br /&gt;
|-&lt;br /&gt;
| 10C0&lt;br /&gt;
| FREQ_CH1&lt;br /&gt;
|rowspan=&amp;quot;4&amp;quot;|&lt;br /&gt;
These registers apparently count the number of rising (or falling?) clock edges on channels 1 to 4. The vendor software polls these counters every second to display a live frequency count for the first four channels.&lt;br /&gt;
&lt;br /&gt;
It is unclear what time base is being used for those counters: The large error (sometimes by more than 20%, especially for CH1) hints at I/O latency, which would imply that the software resets the counters. However, manual testing of single register reads has shown that the values do not seem to scale with the time between reads. This would mean the device is using an internal time base after all. However, that makes the large error a bit hard to explain, especially since the error is different for each channel despite being driven by the same signal source.&lt;br /&gt;
|-&lt;br /&gt;
| 10C4&lt;br /&gt;
| FREQ_CH2&lt;br /&gt;
|-&lt;br /&gt;
| 10C8&lt;br /&gt;
| FREQ_CH3&lt;br /&gt;
|-&lt;br /&gt;
| 10CC&lt;br /&gt;
| FREQ_CH4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Long Registers ===&lt;br /&gt;
&lt;br /&gt;
These are separate 64-bit wide registers mainly used for capture control and status reporting. Single values can be read or written indirectly via special control registers. Commands 7 and 8 can be used to read or write multiple 64-bit values in a single command.&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;
!Index&lt;br /&gt;
!Purpose&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| Channel enable mask&lt;br /&gt;
| Bit mask of enabled channels. Bit 0 (LSB) corresponds to channel 1.&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| Clock divider count&lt;br /&gt;
| Max value of the counter which divides the internal clock to yield the sampling clock, for sampling rates of 100 MS/s or less. The value is calculated as 1 / (samplefreq * 10ns) - 1.&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| Trigger level mask&lt;br /&gt;
| Each bit corresponds to a channel, selecting whether to trigger on low/falling (0) or high/rising (1).&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| Trigger edge mask&lt;br /&gt;
| Each bit corresponds to a channel, selecting whether to trigger on level (0) or edge (1).&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| Trigger enable mask&lt;br /&gt;
| Each bit corresponds to a channel, selecting whether the trigger is enabled (1) or disabled (0).&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| Capture memory fill level&lt;br /&gt;
| On write, the value limits the (compressed) size of the captured data. On read, the current memory fill level is returned.&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| Not used?&lt;br /&gt;
| Apparently unused.&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| Running capture duration&lt;br /&gt;
| Time passed since the first sample. For samplerates up to 100 MS/s, the value is a duration in milliseconds. At 125 MS/s, the value needs to be adjusted by 100/125 = 4/5.&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| Channel input state&lt;br /&gt;
| Each bit corresponds to a channel, showing whether the input signal is currently low (0) or high (1).&lt;br /&gt;
|-&lt;br /&gt;
| 9&lt;br /&gt;
| Capture status flags&lt;br /&gt;
| A bit vector of status flags, as described in the next section. Only the lowest 6 bits appear to be valid, the remaining ones may contain garbage.&lt;br /&gt;
|-&lt;br /&gt;
| 10&lt;br /&gt;
| Capture control&lt;br /&gt;
| This appears to be a control register for starting and stopping data capture.&lt;br /&gt;
|-&lt;br /&gt;
| 100&lt;br /&gt;
| Test ID&lt;br /&gt;
| When read, the fixed value 0x1234567887654321 is returned. This is used for a sanity check during initialization.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The original vendor software uses the bulk read/write commands exclusively with the long registers 0 to 9. The long registers 10 and 100 are only ever accessed indirectly via the control registers 0x10B0 to 0x10BC.&lt;br /&gt;
&lt;br /&gt;
=== Capture Status Flags ===&lt;br /&gt;
&lt;br /&gt;
The status flag bits are used as follows:&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;
!Bit 0&lt;br /&gt;
!Bit 1&lt;br /&gt;
!Bit 2&lt;br /&gt;
!Bit 3&lt;br /&gt;
!Bit 4&lt;br /&gt;
!Bit 5&lt;br /&gt;
|-&lt;br /&gt;
| ???&lt;br /&gt;
| Capturing&lt;br /&gt;
| ???&lt;br /&gt;
| ???&lt;br /&gt;
| Triggered&lt;br /&gt;
| Memory available&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Capture Control Bits ===&lt;br /&gt;
&lt;br /&gt;
The capture control bits of long register 10 are assigned as follows:&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;
!Bit 0&lt;br /&gt;
!Bit 1&lt;br /&gt;
!Bit 2&lt;br /&gt;
!Bit 3&lt;br /&gt;
!Bit 4&lt;br /&gt;
!Bit 5&lt;br /&gt;
!Bit 6&lt;br /&gt;
|-&lt;br /&gt;
| trg_en&lt;br /&gt;
|&lt;br /&gt;
| do_clr_timebase&lt;br /&gt;
|&lt;br /&gt;
| flush_fifo&lt;br /&gt;
| clr_fifo32_ful&lt;br /&gt;
| clr_cntr0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Task Recipes ==&lt;br /&gt;
&lt;br /&gt;
This section lists the commands issued by the software to perform a particular task.&lt;br /&gt;
&lt;br /&gt;
=== Long Register Read ===&lt;br /&gt;
&lt;br /&gt;
This sequence reads from a 64-bit wide internal memory, probably the same as that accessed by commands 7 and 8.&lt;br /&gt;
&lt;br /&gt;
# Write index to address register 0x10B4&lt;br /&gt;
# Read dummy value from strobe register 0x10B0&lt;br /&gt;
# Read high word from register 0x10BC&lt;br /&gt;
# Read low word from register 0x10B8&lt;br /&gt;
&lt;br /&gt;
Steps 3 and 4 appear to be interchangeable.&lt;br /&gt;
&lt;br /&gt;
=== Long Register Write ===&lt;br /&gt;
&lt;br /&gt;
This sequence writes to a 64-bit wide internal memory, probably the same as that accessed by commands 7 and 8.&lt;br /&gt;
&lt;br /&gt;
# Write index to address register 0x10B4&lt;br /&gt;
# Write low word to register 0x10B8&lt;br /&gt;
# Write high word to register 0x10BC&lt;br /&gt;
# Write 0 (dummy value) to strobe register 0x10B0&lt;br /&gt;
&lt;br /&gt;
Steps 2 and 3 appear to be interchangeable.&lt;br /&gt;
&lt;br /&gt;
=== Initialization ===&lt;br /&gt;
&lt;br /&gt;
# Acquire control of USB device and select configuration 1&lt;br /&gt;
# Send FPGA bitstream (default: internal clock) to EP 4 via bulk transfer&lt;br /&gt;
# Device test sequence:&lt;br /&gt;
## Read long register 100; ignore result&lt;br /&gt;
## Read long register 100; result should be 0x1234567887654321&lt;br /&gt;
# Capture setup/state test (vendor software does this, not mandatory):&lt;br /&gt;
## Write sequence 0..9 to capture setup fields (via command 7)&lt;br /&gt;
## Read back capture state (via command 8): 0..4 should be read back as is, 5..9 are trashed anyway&lt;br /&gt;
# Memory test (vendor software does this, not mandatory):&lt;br /&gt;
## Write 2 to register 0x1074&lt;br /&gt;
## Write 0 to register 0x107C&lt;br /&gt;
## Read memory beginning at address 0 in chunks of 120 36-bit words, up to but not including 0x013FB0&lt;br /&gt;
## Read memory beginning at address 0x013FB0 in chunks of 8 36-bit words, up to but not including 0x014000&lt;br /&gt;
&lt;br /&gt;
It does not seem to be necessary to use exactly the same read chunk length as the original vendor software. See the description of command 6 for constraints.&lt;br /&gt;
&lt;br /&gt;
=== Poll channel state ===&lt;br /&gt;
&lt;br /&gt;
The vendor software continuously polls the channel state even when idle. However, it is not mandatory to do so.&lt;br /&gt;
&lt;br /&gt;
# Poll frequency of signal at CH1 to CH4:&lt;br /&gt;
## Read register 0x10C0: value is frequency of CH1 signal&lt;br /&gt;
## Read register 0x10C4: value is frequency of CH2 signal&lt;br /&gt;
## Read register 0x10C8: value is frequency of CH3 signal&lt;br /&gt;
## Read register 0x10CC: value is frequency of CH4 signal&lt;br /&gt;
# Poll signal level of all channels:&lt;br /&gt;
## Read capture state (via command 8): the signal level of all channels is recorded in field 8&lt;br /&gt;
&lt;br /&gt;
=== Clocking Mode Switch ===&lt;br /&gt;
&lt;br /&gt;
# Transfer one of three FPGA bitstreams to EP 4:&lt;br /&gt;
## Configuration for internal clock&lt;br /&gt;
## Configuration for external clock, rising edge&lt;br /&gt;
## Configuration for external clock, falling edge&lt;br /&gt;
&lt;br /&gt;
=== Signal Capture ===&lt;br /&gt;
&lt;br /&gt;
# Write 2 to register 0x1074&lt;br /&gt;
# Write 1 to register 0x1074&lt;br /&gt;
# Write 0x74 to long register 10&lt;br /&gt;
# Write divider bypass flag to register 0x1094 (see description of register)&lt;br /&gt;
# Write capture setup (command 7, address 0, length 10: see description of command)&lt;br /&gt;
# Write 1 to long register 10&lt;br /&gt;
# Wait for capture to finish:&lt;br /&gt;
## Poll capture state (command 8, address 0, length 10: see description of command)&lt;br /&gt;
## Report progress information (got trigger, cycles elapsed, memory fill percentage) to user&lt;br /&gt;
## Capture has finished once the memory available flag is reset&lt;br /&gt;
&lt;br /&gt;
=== Cancel Signal Capture ===&lt;br /&gt;
&lt;br /&gt;
# Write 0 to long register 10&lt;br /&gt;
# Write 0 to register 0x1094 (divider bypass flag)&lt;br /&gt;
&lt;br /&gt;
After that, the memory available flag in the capture state should have been cleared. Continue in the same manner as for a regularly finished capture.&lt;br /&gt;
&lt;br /&gt;
=== Read Captured Data ===&lt;br /&gt;
&lt;br /&gt;
# Read register 0x1078: value is the number of 36-bit words in the capture buffer&lt;br /&gt;
# Write 1 to register 0x1094 (divider bypass flag)&lt;br /&gt;
# Write 2 to register 0x1074&lt;br /&gt;
# Write 4 to register 0x107C&lt;br /&gt;
# Read capture buffer:&lt;br /&gt;
## Read memory beginning at address 4 in chunks of 120 36-bit words, up to but not including 0x03FFC4&lt;br /&gt;
## Read memory beginning at address 0x03FFC4 in chunks of 8 36-bit words, up to but not including 0x03FFF4&lt;br /&gt;
# Write 0 to register 0x1094 (divider bypass flag)&lt;br /&gt;
# Issue command 5 with scrambled data to be verified by the device for copy protection&lt;br /&gt;
&lt;br /&gt;
It does not seem to be necessary to use exactly the same read chunk length as the original vendor software. See the description of command 6 for constraints.&lt;br /&gt;
&lt;br /&gt;
The original software does the copy protection check only for the first three captures. It is in fact possible to not send command 5 at all, which is exactly what the sigrok driver does.&lt;br /&gt;
&lt;br /&gt;
=== Shutdown ===&lt;br /&gt;
&lt;br /&gt;
1. Transfer FPGA configuration for device shutdown to EP 4&lt;/div&gt;</summary>
		<author><name>Danielk</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=Sysclk_LWLA1034/Protocol&amp;diff=11181</id>
		<title>Sysclk LWLA1034/Protocol</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=Sysclk_LWLA1034/Protocol&amp;diff=11181"/>
		<updated>2015-10-25T16:51:49Z</updated>

		<summary type="html">&lt;p&gt;Danielk: Clear up the command 5 mystery&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== FPGA Configuration ==&lt;br /&gt;
&lt;br /&gt;
The FPGA bitstream is loaded via bulk transfer to USB end point 4. Each firmware transfer starts with a 4-byte header to announce the transfer size. The payload appears to be a Raw Binary File (.rbf) with compression enabled.&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;
!Length&lt;br /&gt;
!Payload...&lt;br /&gt;
|-&lt;br /&gt;
| nnnn-nnnn&lt;br /&gt;
| dd...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Unlike the control commands, the firmware transfer is apparently byte-based. The length is a byte count encoded in big endian (1-2-3-4) byte order, and includes the size of the length field (4 bytes) itself.&lt;br /&gt;
&lt;br /&gt;
=== Application Behavior ===&lt;br /&gt;
&lt;br /&gt;
The vendor software transfers a new bitstream to the FPGA&lt;br /&gt;
# on application start,&lt;br /&gt;
# when switching clocking mode between internal, external/rising or external/falling,&lt;br /&gt;
# on application exit.&lt;br /&gt;
&lt;br /&gt;
The size of the bitstream varies due to compression, but is in the order of 50kB to 80kB. The firmware transfer is split by the vendor software into packets with 15 byte payload each and thus takes quite a bit of time inside VirtualBox. Testing with a libusb-based tool for issuing USB bulk transfers has shown that this does not appear to be necessary: Transferring even the entire firmware blob in a single bulk transfer appears to work without error.&lt;br /&gt;
=== Firmware Extraction ===&lt;br /&gt;
&lt;br /&gt;
The firmware blobs can be extracted directly from the Windows installer executable located on the CD-ROM that ships with the device.  The file &amp;lt;tt&amp;gt;lwla1034_EN_setup.exe&amp;lt;/tt&amp;gt; on the CD-ROM from 2012-07-12 has the firmware blobs located at the following offsets:&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;
!Offset&lt;br /&gt;
!Length&lt;br /&gt;
!Mode&lt;br /&gt;
|-&lt;br /&gt;
| 34110338&lt;br /&gt;
| 78398&lt;br /&gt;
| Internal clock&lt;br /&gt;
|-&lt;br /&gt;
| 34266237&lt;br /&gt;
| 78247&lt;br /&gt;
| External clock (rising edge)&lt;br /&gt;
|-&lt;br /&gt;
| 34344484&lt;br /&gt;
| 79145&lt;br /&gt;
| External clock (falling edge)&lt;br /&gt;
|-&lt;br /&gt;
| 34578631&lt;br /&gt;
| 48525&lt;br /&gt;
| Shutdown&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Both offsets and lengths are in bytes. The extracted blobs already include the header with the 32-bit length field.&lt;br /&gt;
&lt;br /&gt;
== Control Commands ==&lt;br /&gt;
&lt;br /&gt;
Control commands are sent via bulk transfer to USB end point 2, with the response (if any) coming in from end point 6.&lt;br /&gt;
&lt;br /&gt;
Command messages are sent to the device as a sequence of 16-bit words with little endian byte order. The first word in a message identifies the command type. Different command types have different message lengths. Some command types include a length field and allow for messages of variable length, others are of fixed size.&lt;br /&gt;
&lt;br /&gt;
There are read commands which trigger an immediate response from the device, and write commands without a response.&lt;br /&gt;
&lt;br /&gt;
=== Command 0001: Read Register ===&lt;br /&gt;
&lt;br /&gt;
This command reads a 32-bit wide control register.&lt;br /&gt;
&lt;br /&gt;
==== Command ====&lt;br /&gt;
&lt;br /&gt;
Fixed length of 2 words (4 bytes).&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;
!ID&lt;br /&gt;
!Address&lt;br /&gt;
|-&lt;br /&gt;
| 0001&lt;br /&gt;
| aaaa&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Response ====&lt;br /&gt;
&lt;br /&gt;
The response has a fixed length of 2 words (4 bytes). It is the content of a 32-bit register in mixed endian (2-1-4-3) byte order.&lt;br /&gt;
&lt;br /&gt;
=== Command 0002: Write Register ===&lt;br /&gt;
&lt;br /&gt;
This command writes a 32-bit value to a control register.&lt;br /&gt;
&lt;br /&gt;
==== Command ====&lt;br /&gt;
&lt;br /&gt;
Fixed length of 4 words (8 bytes).&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;
!ID&lt;br /&gt;
!Address&lt;br /&gt;
!Data&lt;br /&gt;
|-&lt;br /&gt;
| 0002&lt;br /&gt;
| aaaa&lt;br /&gt;
| dddd-dddd&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The value is encoded in mixed endian (2-1-4-3) byte order.&lt;br /&gt;
&lt;br /&gt;
=== Command 0005: Copy Protection Check ===&lt;br /&gt;
&lt;br /&gt;
This command writes 16 32-bit words which are then verified by the device for copy protection purposes. The vendor software issues this after a transfer of captured data to the host has finished, but only for the first three captures.&lt;br /&gt;
&lt;br /&gt;
The values are apparently obtained by scrambling and/or hashing the captured data. The device functions correctly even without ever sending this command. For this reason, the LWLA1034 firmware distributed with sigrok implements the copy protection in the FPGA instead.&lt;br /&gt;
&lt;br /&gt;
==== Command ====&lt;br /&gt;
&lt;br /&gt;
Fixed length of 33 words (66 bytes).&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;
!ID&lt;br /&gt;
!Data 1&lt;br /&gt;
!Data 2&lt;br /&gt;
!...&lt;br /&gt;
!Data 16&lt;br /&gt;
|-&lt;br /&gt;
| 0005&lt;br /&gt;
| dddd-dddd&lt;br /&gt;
| dddd-dddd&lt;br /&gt;
| ...&lt;br /&gt;
| dddd-dddd&lt;br /&gt;
|}&lt;br /&gt;
The byte order of each 32-bit word is the usual 2-1-4-3 mixed endianess. It appears that the three high bytes of each word are always zero.&lt;br /&gt;
&lt;br /&gt;
=== Command 0006: Read Memory at Address ===&lt;br /&gt;
&lt;br /&gt;
This command reads a chunk of data from the device memory (SRAM). It allows for random access using a 32-bit start address, and for variable length via a 32-bit length field. The software uses this command to read captured data from the device&amp;#039;s buffer.&lt;br /&gt;
&lt;br /&gt;
==== Command ====&lt;br /&gt;
&lt;br /&gt;
Fixed length of 5 words (10 bytes).&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;
!ID&lt;br /&gt;
!Address&lt;br /&gt;
!Length&lt;br /&gt;
|-&lt;br /&gt;
| 0006&lt;br /&gt;
| aaaa-aaaa&lt;br /&gt;
| nnnn-nnnn&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Both the address and the length are encoded in mixed endian (2-1-4-3) byte order.&lt;br /&gt;
&lt;br /&gt;
==== Response ====&lt;br /&gt;
&lt;br /&gt;
The memory is 36 bit wide, and thus the size of the response in bits is 36 times the value in the length field. The original vendor software reads chunks of 120 words @ 36 bit at a time, which works out to an integer multiple of 32 (i.e. 4320 bits = 135 32-bit words or 540 bytes). The final six reads are done in chunks of 8 words @ 36 bit, which works out to nine 32-bit words or 36 bytes. The overall amount of memory being read when fetching captured samples from a full buffer is just below the RAM size of 256k×36 bit.&lt;br /&gt;
&lt;br /&gt;
Note that the software always starts reading at address 4 rather than 0. Presumably, the firmware uses the first four 36-bit words for internal bookkeeping or some other purpose. Exception to the rule: For some unknown reason (perhaps testing), the memory is also being read on start-up right after loading the firmware into the FPGA. In this case, altogether 128000 36-bit words are being read beginning at address 0.&lt;br /&gt;
&lt;br /&gt;
Note that reading more than 1024 bytes at a time seems to be unreliable. Due to the constraints outlined in the following section, the maximum read length should therefore be restricted to 224 device words, which works out to 1008 bytes.&lt;br /&gt;
&lt;br /&gt;
===== 36-to-32 Bit Mapping =====&lt;br /&gt;
&lt;br /&gt;
The data returned by the read command consists of 32-bit words in 2-1-4-3 mixed endian byte order. Eight consecutive 36-bit words from the SRAM are mapped at a time to nine consecutive 32-bit words in the received stream. The first of these slices aligns to the beginning of the read-out stream, apparently irrespective of the absolute start address of the read operation.&lt;br /&gt;
&lt;br /&gt;
The first eight 32-bit words in a slice contain the lower 32 bit of the eight encoded 36-bit words. The ninth 32-bit word contains the four remaining high bits of all eight 36-bit words combined. The high nibbles are shifted into the ninth word from right to left, resulting in a 1-2-3-4-5-6-7-8 order of nibbles. (This is after conversion from mixed endian byte order!)&lt;br /&gt;
&lt;br /&gt;
As it is necessary to access the ninth 32-bit word in each slice even to fully extract the first 36-bit word, it follows that memory reads should always request a multiple of the slice length, i.e. eight 36-bit words. The length of the response will thus always be a multiple of nine 32-bit words (36 bytes). However, it does not appear to be necessary to restrict read operations to only the two lengths 120 and 8 used by the vendor software.&lt;br /&gt;
&lt;br /&gt;
===== Compression Scheme =====&lt;br /&gt;
&lt;br /&gt;
The compression scheme is a form of run-length encoding. Very short run lengths of only one or two cycles are handled as special cases, which helps to keep the worst-case overhead of compression pretty low. In particular, the scheme ensures that it is never necessary to write more than one 36-bit word per sampling cycle to the SRAM buffer.&lt;br /&gt;
&lt;br /&gt;
Each 36-bit word in the stream is either a data word or a repeat half-count word. The first word in the stream is a data word, with the following layout:&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;
!Bit&lt;br /&gt;
!35&lt;br /&gt;
!34&lt;br /&gt;
!33&lt;br /&gt;
!32&lt;br /&gt;
!31&lt;br /&gt;
!...&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
!Meaning&lt;br /&gt;
| Repeat count follows&lt;br /&gt;
| LSB of repeat count&lt;br /&gt;
| CH34&lt;br /&gt;
| CH33&lt;br /&gt;
| CH32&lt;br /&gt;
| ...&lt;br /&gt;
| CH3&lt;br /&gt;
| CH2&lt;br /&gt;
| CH1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
If bit 35 is set, then the next 36-bit word in the stream encodes the number of cycles the previous data word is repeated, divided by two. The actual number of repeat cycles is twice that number plus the LSB of repeat count, i.e. bit 34 from the data word. If bit 35 is not set the next word is again a data word and the repeat half-count is assumed as zero. However, the LSB of repeat count bit still applies; i.e. if it is set then the repeat count would be 1.&lt;br /&gt;
&lt;br /&gt;
So, to recap, repeat counts 0 to 1 are encoded as part of the channel data word, larger repeat counts use up a full extra 36-bit word. The combined repeat count is then 37 bit wide. At 125 MHz, this scheme would allow for encoding run lengths of more than 18 minutes. However, note that the vendor software does not actually make use of the full range: Apparently, it stops as soon as the count rolls over into bit 36, thereby cutting the maximum possible run length in half (i.e. about 9 minutes at 125 MHz). However, this detail does not make any difference for the decompression algorithm.&lt;br /&gt;
&lt;br /&gt;
The next word following a repeat half-count is again a data word. Note that it is possible for a sample/run-length pair to be split across a slice boundary, or even across successive read chunks. The decoder therefore needs to keep track of RLE state across slices as well as read operations.&lt;br /&gt;
&lt;br /&gt;
=== Command 0007: Write Long Registers ===&lt;br /&gt;
&lt;br /&gt;
This command writes several long registers in bulk. The long registers are 64 bit wide and use their own address space separate from the 32-bit control registers.&lt;br /&gt;
&lt;br /&gt;
The vendor software issues this command once during start-up, and once for each capture operation as part of the setup sequence. It is also issued when clicking the Stop button to cancel a capture in progress.&lt;br /&gt;
&lt;br /&gt;
==== Command ====&lt;br /&gt;
&lt;br /&gt;
Variable length of 3 words (6 bytes) plus length × 4 words (8 bytes).&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;
!ID&lt;br /&gt;
!Address&lt;br /&gt;
!Length&lt;br /&gt;
!Data&lt;br /&gt;
!...&lt;br /&gt;
|-&lt;br /&gt;
| 0007&lt;br /&gt;
| aaaa&lt;br /&gt;
| nnnn&lt;br /&gt;
| dddd-dddd-dddd-dddd&lt;br /&gt;
| ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The two argument words are the start address and the length of the slice to write, in little endian byte order. Both the address and the length refer to quantities of 64 bit (4 words or 8 bytes). Thus, if length is 10 the payload should consist of 40 words or 80 bytes.&lt;br /&gt;
&lt;br /&gt;
The vendor software always writes a slice of length 10 beginning at address 0, thus completely resetting both the capture configuration as well as the capture status. See the table of long registers for a description of the configuration and status fields.&lt;br /&gt;
&lt;br /&gt;
=== Command 0008: Read Long Registers ===&lt;br /&gt;
&lt;br /&gt;
This command reads several long registers in bulk. The long registers are 64 bit wide and use their own address space separate from the 32-bit control registers.&lt;br /&gt;
&lt;br /&gt;
The software uses this command mainly to read the block of capture status registers. During idle periods, the original vendor software polls the channel state about 34 times per second for its live port status display. During a capture operation, it is necessary to poll the status in order to find out whether the capture buffer has been filled completely and samples can be retrieved.&lt;br /&gt;
&lt;br /&gt;
==== Command ====&lt;br /&gt;
&lt;br /&gt;
Fixed length of 3 words (6 bytes).&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;
!ID&lt;br /&gt;
!Address&lt;br /&gt;
!Length&lt;br /&gt;
|-&lt;br /&gt;
| 0008&lt;br /&gt;
| aaaa&lt;br /&gt;
| nnnn&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The two argument words are the start address and the length of the slice to read, in little endian byte order. Both the address and the length refer to quantities of 64 bit (4 words or 8 bytes). Thus, if length is 10 the reply will consist of 40 words or 80 bytes.&lt;br /&gt;
&lt;br /&gt;
Although the vendor software always reads the full 10 fields of configuration and status information, it does not seem to be an actual requirement. Restricting reads to fields 5 to 9 in the sigrok driver works fine so far without any problems.&lt;br /&gt;
&lt;br /&gt;
==== Response ====&lt;br /&gt;
&lt;br /&gt;
Each returned 64-bit word is in very much mixed up (6-5-8-7-2-1-4-3) byte order. See the table of long registers for the meaning of the values at each address.&lt;br /&gt;
&lt;br /&gt;
== Control Registers ==&lt;br /&gt;
&lt;br /&gt;
The device exposes a number of 32-bit wide registers accessed via commands 1 and 2. Some of the register addresses appearing in the protocol also occur in the LWLA1016 protocol, although it seems that their purpose may not be the same. Other registers appear to be specific to the LWLA1034.&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;
!Address&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
| 1074&lt;br /&gt;
| MEM_CTRL&lt;br /&gt;
| Control register for capture memory access.&lt;br /&gt;
|-&lt;br /&gt;
| 1078&lt;br /&gt;
| MEM_FILL&lt;br /&gt;
| Compressed size of captured data (number of 36-bit words).&lt;br /&gt;
|-&lt;br /&gt;
| 107C&lt;br /&gt;
| MEM_ADDR?&lt;br /&gt;
| Not clear if this is an address or another control register, or even if it is needed at all.&lt;br /&gt;
|-&lt;br /&gt;
| 1090&lt;br /&gt;
| TEST?&lt;br /&gt;
| Writing 1 to this register apparently enables some sort of test mode.&lt;br /&gt;
|-&lt;br /&gt;
| 1094&lt;br /&gt;
| DIV_BYPASS&lt;br /&gt;
| This is set to 0 when using the internal clock with sampling rates of 100 MHz and below. For 125 MHz internal clock or the external clock modes, it is set to 1.&lt;br /&gt;
|-&lt;br /&gt;
| 10B0&lt;br /&gt;
| LONG_STROBE&lt;br /&gt;
| Long register read/write strobe.&lt;br /&gt;
|-&lt;br /&gt;
| 10B4&lt;br /&gt;
| LONG_ADDR&lt;br /&gt;
| Long register address.&lt;br /&gt;
|-&lt;br /&gt;
| 10B8&lt;br /&gt;
| LONG_LOW&lt;br /&gt;
| Long register low word.&lt;br /&gt;
|-&lt;br /&gt;
| 10BC&lt;br /&gt;
| LONG_HIGH&lt;br /&gt;
| Long register high word.&lt;br /&gt;
|-&lt;br /&gt;
| 10C0&lt;br /&gt;
| FREQ_CH1&lt;br /&gt;
|rowspan=&amp;quot;4&amp;quot;|&lt;br /&gt;
These registers apparently count the number of rising (or falling?) clock edges on channels 1 to 4. The vendor software polls these counters every second to display a live frequency count for the first four channels.&lt;br /&gt;
&lt;br /&gt;
It is unclear what time base is being used for those counters: The large error (sometimes by more than 20%, especially for CH1) hints at I/O latency, which would imply that the software resets the counters. However, manual testing of single register reads has shown that the values do not seem to scale with the time between reads. This would mean the device is using an internal time base after all. However, that makes the large error a bit hard to explain, especially since the error is different for each channel despite being driven by the same signal source.&lt;br /&gt;
|-&lt;br /&gt;
| 10C4&lt;br /&gt;
| FREQ_CH2&lt;br /&gt;
|-&lt;br /&gt;
| 10C8&lt;br /&gt;
| FREQ_CH3&lt;br /&gt;
|-&lt;br /&gt;
| 10CC&lt;br /&gt;
| FREQ_CH4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Long Registers ===&lt;br /&gt;
&lt;br /&gt;
These are separate 64-bit wide registers mainly used for capture control and status reporting. Single values can be read or written indirectly via special control registers. Commands 7 and 8 can be used to read or write multiple 64-bit values in a single command.&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;
!Index&lt;br /&gt;
!Purpose&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| Channel enable mask&lt;br /&gt;
| Bit mask of enabled channels. Bit 0 (LSB) corresponds to channel 1.&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| Clock divider count&lt;br /&gt;
| Max value of the counter which divides the internal clock to yield the sampling clock, for sampling rates of 100 MS/s or less. The value is calculated as 1 / (samplefreq * 10ns) - 1.&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| Trigger level mask&lt;br /&gt;
| Each bit corresponds to a channel, selecting whether to trigger on low/falling (0) or high/rising (1).&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| Trigger edge mask&lt;br /&gt;
| Each bit corresponds to a channel, selecting whether to trigger on level (0) or edge (1).&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| Trigger enable mask&lt;br /&gt;
| Each bit corresponds to a channel, selecting whether the trigger is enabled (1) or disabled (0).&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| Capture memory fill level&lt;br /&gt;
| On write, the value limits the (compressed) size of the captured data. On read, the current memory fill level is returned.&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| Not used?&lt;br /&gt;
| Apparently unused.&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| Running capture duration&lt;br /&gt;
| Time passed since the first sample. For samplerates up to 100 MS/s, the value is a duration in milliseconds. At 125 MS/s, the value needs to be adjusted by 100/125 = 4/5.&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| Channel input state&lt;br /&gt;
| Each bit corresponds to a channel, showing whether the input signal is currently low (0) or high (1).&lt;br /&gt;
|-&lt;br /&gt;
| 9&lt;br /&gt;
| Capture status flags&lt;br /&gt;
| A bit vector of status flags, as described in the next section. Only the lowest 6 bits appear to be valid, the remaining ones may contain garbage.&lt;br /&gt;
|-&lt;br /&gt;
| 10&lt;br /&gt;
| Capture control&lt;br /&gt;
| This appears to be a control register for starting and stopping data capture.&lt;br /&gt;
|-&lt;br /&gt;
| 100&lt;br /&gt;
| Test ID&lt;br /&gt;
| When read, the fixed value 0x1234567887654321 is returned. This is used for a sanity check during initialization.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The original vendor software uses the bulk read/write commands exclusively with the long registers 0 to 9. The long registers 10 and 100 are only ever accessed indirectly via the control registers 0x10B0 to 0x10BC.&lt;br /&gt;
&lt;br /&gt;
=== Capture Status Flags ===&lt;br /&gt;
&lt;br /&gt;
The status flag bits are used as follows:&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;
!Bit 0&lt;br /&gt;
!Bit 1&lt;br /&gt;
!Bit 2&lt;br /&gt;
!Bit 3&lt;br /&gt;
!Bit 4&lt;br /&gt;
!Bit 5&lt;br /&gt;
|-&lt;br /&gt;
| ???&lt;br /&gt;
| Capturing&lt;br /&gt;
| ???&lt;br /&gt;
| ???&lt;br /&gt;
| Triggered&lt;br /&gt;
| Memory available&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Task Recipes ==&lt;br /&gt;
&lt;br /&gt;
This section lists the commands issued by the software to perform a particular task.&lt;br /&gt;
&lt;br /&gt;
=== Long Register Read ===&lt;br /&gt;
&lt;br /&gt;
This sequence reads from a 64-bit wide internal memory, probably the same as that accessed by commands 7 and 8.&lt;br /&gt;
&lt;br /&gt;
# Write index to address register 0x10B4&lt;br /&gt;
# Read dummy value from strobe register 0x10B0&lt;br /&gt;
# Read high word from register 0x10BC&lt;br /&gt;
# Read low word from register 0x10B8&lt;br /&gt;
&lt;br /&gt;
Steps 3 and 4 appear to be interchangeable.&lt;br /&gt;
&lt;br /&gt;
=== Long Register Write ===&lt;br /&gt;
&lt;br /&gt;
This sequence writes to a 64-bit wide internal memory, probably the same as that accessed by commands 7 and 8.&lt;br /&gt;
&lt;br /&gt;
# Write index to address register 0x10B4&lt;br /&gt;
# Write low word to register 0x10B8&lt;br /&gt;
# Write high word to register 0x10BC&lt;br /&gt;
# Write 0 (dummy value) to strobe register 0x10B0&lt;br /&gt;
&lt;br /&gt;
Steps 2 and 3 appear to be interchangeable.&lt;br /&gt;
&lt;br /&gt;
=== Initialization ===&lt;br /&gt;
&lt;br /&gt;
# Acquire control of USB device and select configuration 1&lt;br /&gt;
# Send FPGA bitstream (default: internal clock) to EP 4 via bulk transfer&lt;br /&gt;
# Device test sequence:&lt;br /&gt;
## Read long register 100; ignore result&lt;br /&gt;
## Read long register 100; result should be 0x1234567887654321&lt;br /&gt;
# Capture setup/state test (vendor software does this, not mandatory):&lt;br /&gt;
## Write sequence 0..9 to capture setup fields (via command 7)&lt;br /&gt;
## Read back capture state (via command 8): 0..4 should be read back as is, 5..9 are trashed anyway&lt;br /&gt;
# Memory test (vendor software does this, not mandatory):&lt;br /&gt;
## Write 2 to register 0x1074&lt;br /&gt;
## Write 0 to register 0x107C&lt;br /&gt;
## Read memory beginning at address 0 in chunks of 120 36-bit words, up to but not including 0x013FB0&lt;br /&gt;
## Read memory beginning at address 0x013FB0 in chunks of 8 36-bit words, up to but not including 0x014000&lt;br /&gt;
&lt;br /&gt;
It does not seem to be necessary to use exactly the same read chunk length as the original vendor software. See the description of command 6 for constraints.&lt;br /&gt;
&lt;br /&gt;
=== Poll channel state ===&lt;br /&gt;
&lt;br /&gt;
The vendor software continuously polls the channel state even when idle. However, it is not mandatory to do so.&lt;br /&gt;
&lt;br /&gt;
# Poll frequency of signal at CH1 to CH4:&lt;br /&gt;
## Read register 0x10C0: value is frequency of CH1 signal&lt;br /&gt;
## Read register 0x10C4: value is frequency of CH2 signal&lt;br /&gt;
## Read register 0x10C8: value is frequency of CH3 signal&lt;br /&gt;
## Read register 0x10CC: value is frequency of CH4 signal&lt;br /&gt;
# Poll signal level of all channels:&lt;br /&gt;
## Read capture state (via command 8): the signal level of all channels is recorded in field 8&lt;br /&gt;
&lt;br /&gt;
=== Clocking Mode Switch ===&lt;br /&gt;
&lt;br /&gt;
# Transfer one of three FPGA bitstreams to EP 4:&lt;br /&gt;
## Configuration for internal clock&lt;br /&gt;
## Configuration for external clock, rising edge&lt;br /&gt;
## Configuration for external clock, falling edge&lt;br /&gt;
&lt;br /&gt;
=== Signal Capture ===&lt;br /&gt;
&lt;br /&gt;
# Write 2 to register 0x1074&lt;br /&gt;
# Write 1 to register 0x1074&lt;br /&gt;
# Write 0x74 to long register 10&lt;br /&gt;
# Write divider bypass flag to register 0x1094 (see description of register)&lt;br /&gt;
# Write capture setup (command 7, address 0, length 10: see description of command)&lt;br /&gt;
# Write 1 to long register 10&lt;br /&gt;
# Wait for capture to finish:&lt;br /&gt;
## Poll capture state (command 8, address 0, length 10: see description of command)&lt;br /&gt;
## Report progress information (got trigger, cycles elapsed, memory fill percentage) to user&lt;br /&gt;
## Capture has finished once the memory available flag is reset&lt;br /&gt;
&lt;br /&gt;
=== Cancel Signal Capture ===&lt;br /&gt;
&lt;br /&gt;
# Write 0 to long register 10&lt;br /&gt;
# Write 0 to register 0x1094 (divider bypass flag)&lt;br /&gt;
&lt;br /&gt;
After that, the memory available flag in the capture state should have been cleared. Continue in the same manner as for a regularly finished capture.&lt;br /&gt;
&lt;br /&gt;
=== Read Captured Data ===&lt;br /&gt;
&lt;br /&gt;
# Read register 0x1078: value is the number of 36-bit words in the capture buffer&lt;br /&gt;
# Write 1 to register 0x1094 (divider bypass flag)&lt;br /&gt;
# Write 2 to register 0x1074&lt;br /&gt;
# Write 4 to register 0x107C&lt;br /&gt;
# Read capture buffer:&lt;br /&gt;
## Read memory beginning at address 4 in chunks of 120 36-bit words, up to but not including 0x03FFC4&lt;br /&gt;
## Read memory beginning at address 0x03FFC4 in chunks of 8 36-bit words, up to but not including 0x03FFF4&lt;br /&gt;
# Write 0 to register 0x1094 (divider bypass flag)&lt;br /&gt;
# Issue command 5 with scrambled data to be verified by the device for copy protection&lt;br /&gt;
&lt;br /&gt;
It does not seem to be necessary to use exactly the same read chunk length as the original vendor software. See the description of command 6 for constraints.&lt;br /&gt;
&lt;br /&gt;
The original software does the copy protection check only for the first three captures. It is in fact possible to not send command 5 at all, which is exactly what the sigrok driver does.&lt;br /&gt;
&lt;br /&gt;
=== Shutdown ===&lt;br /&gt;
&lt;br /&gt;
1. Transfer FPGA configuration for device shutdown to EP 4&lt;/div&gt;</summary>
		<author><name>Danielk</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=Sysclk_LWLA1034/Protocol&amp;diff=11180</id>
		<title>Sysclk LWLA1034/Protocol</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=Sysclk_LWLA1034/Protocol&amp;diff=11180"/>
		<updated>2015-10-25T16:26:01Z</updated>

		<summary type="html">&lt;p&gt;Danielk: Create table of long registers and move capture status/control documentation there&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== FPGA Configuration ==&lt;br /&gt;
&lt;br /&gt;
The FPGA bitstream is loaded via bulk transfer to USB end point 4. Each firmware transfer starts with a 4-byte header to announce the transfer size. The payload appears to be a Raw Binary File (.rbf) with compression enabled.&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;
!Length&lt;br /&gt;
!Payload...&lt;br /&gt;
|-&lt;br /&gt;
| nnnn-nnnn&lt;br /&gt;
| dd...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Unlike the control commands, the firmware transfer is apparently byte-based. The length is a byte count encoded in big endian (1-2-3-4) byte order, and includes the size of the length field (4 bytes) itself.&lt;br /&gt;
&lt;br /&gt;
=== Application Behavior ===&lt;br /&gt;
&lt;br /&gt;
The vendor software transfers a new bitstream to the FPGA&lt;br /&gt;
# on application start,&lt;br /&gt;
# when switching clocking mode between internal, external/rising or external/falling,&lt;br /&gt;
# on application exit.&lt;br /&gt;
&lt;br /&gt;
The size of the bitstream varies due to compression, but is in the order of 50kB to 80kB. The firmware transfer is split by the vendor software into packets with 15 byte payload each and thus takes quite a bit of time inside VirtualBox. Testing with a libusb-based tool for issuing USB bulk transfers has shown that this does not appear to be necessary: Transferring even the entire firmware blob in a single bulk transfer appears to work without error.&lt;br /&gt;
=== Firmware Extraction ===&lt;br /&gt;
&lt;br /&gt;
The firmware blobs can be extracted directly from the Windows installer executable located on the CD-ROM that ships with the device.  The file &amp;lt;tt&amp;gt;lwla1034_EN_setup.exe&amp;lt;/tt&amp;gt; on the CD-ROM from 2012-07-12 has the firmware blobs located at the following offsets:&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;
!Offset&lt;br /&gt;
!Length&lt;br /&gt;
!Mode&lt;br /&gt;
|-&lt;br /&gt;
| 34110338&lt;br /&gt;
| 78398&lt;br /&gt;
| Internal clock&lt;br /&gt;
|-&lt;br /&gt;
| 34266237&lt;br /&gt;
| 78247&lt;br /&gt;
| External clock (rising edge)&lt;br /&gt;
|-&lt;br /&gt;
| 34344484&lt;br /&gt;
| 79145&lt;br /&gt;
| External clock (falling edge)&lt;br /&gt;
|-&lt;br /&gt;
| 34578631&lt;br /&gt;
| 48525&lt;br /&gt;
| Shutdown&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Both offsets and lengths are in bytes. The extracted blobs already include the header with the 32-bit length field.&lt;br /&gt;
&lt;br /&gt;
== Control Commands ==&lt;br /&gt;
&lt;br /&gt;
Control commands are sent via bulk transfer to USB end point 2, with the response (if any) coming in from end point 6.&lt;br /&gt;
&lt;br /&gt;
Command messages are sent to the device as a sequence of 16-bit words with little endian byte order. The first word in a message identifies the command type. Different command types have different message lengths. Some command types include a length field and allow for messages of variable length, others are of fixed size.&lt;br /&gt;
&lt;br /&gt;
There are read commands which trigger an immediate response from the device, and write commands without a response.&lt;br /&gt;
&lt;br /&gt;
=== Command 0001: Read Register ===&lt;br /&gt;
&lt;br /&gt;
This command reads a 32-bit wide control register.&lt;br /&gt;
&lt;br /&gt;
==== Command ====&lt;br /&gt;
&lt;br /&gt;
Fixed length of 2 words (4 bytes).&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;
!ID&lt;br /&gt;
!Address&lt;br /&gt;
|-&lt;br /&gt;
| 0001&lt;br /&gt;
| aaaa&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Response ====&lt;br /&gt;
&lt;br /&gt;
The response has a fixed length of 2 words (4 bytes). It is the content of a 32-bit register in mixed endian (2-1-4-3) byte order.&lt;br /&gt;
&lt;br /&gt;
=== Command 0002: Write Register ===&lt;br /&gt;
&lt;br /&gt;
This command writes a 32-bit value to a control register.&lt;br /&gt;
&lt;br /&gt;
==== Command ====&lt;br /&gt;
&lt;br /&gt;
Fixed length of 4 words (8 bytes).&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;
!ID&lt;br /&gt;
!Address&lt;br /&gt;
!Data&lt;br /&gt;
|-&lt;br /&gt;
| 0002&lt;br /&gt;
| aaaa&lt;br /&gt;
| dddd-dddd&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The value is encoded in mixed endian (2-1-4-3) byte order.&lt;br /&gt;
&lt;br /&gt;
=== Command 0005: Write ??? ===&lt;br /&gt;
&lt;br /&gt;
This command appears to write 16 32-bit words at once. The vendor software issues this after a transfer of captured data to the host has finished, but only for the first three captures. After that, the application needs to be restarted to ever see this command again.&lt;br /&gt;
&lt;br /&gt;
The data written varies each time, but it appears that only the lowest 8 bit of each 32-bit word are ever written. No idea what this might do. It could be calibration feedback or something, although it is hard to imagine how the host could help the device with that. Luckily, the sigrok driver works without ever sending this command at all.&lt;br /&gt;
&lt;br /&gt;
==== Command ====&lt;br /&gt;
&lt;br /&gt;
Fixed length of 33 words (66 bytes).&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;
!ID&lt;br /&gt;
!Data 1&lt;br /&gt;
!Data 2&lt;br /&gt;
!...&lt;br /&gt;
!Data 16&lt;br /&gt;
|-&lt;br /&gt;
| 0005&lt;br /&gt;
| dddd-dddd&lt;br /&gt;
| dddd-dddd&lt;br /&gt;
| ...&lt;br /&gt;
| dddd-dddd&lt;br /&gt;
|}&lt;br /&gt;
The byte order of each 32-bit word is most likely the usual 2-1-4-3 mixed endianess.&lt;br /&gt;
&lt;br /&gt;
==== Sample capture ====&lt;br /&gt;
&lt;br /&gt;
A sample of three such commands from an actual protocol analysis session:&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
 10185	56.455640		Cmd 5: write ??? data C3 9A 4B 91 30 D2 98 C1 CA F2 D7 4F 82 74 C0 8B&lt;br /&gt;
 14155	95.788766		Cmd 5: write ??? data E5 7B 2C F3 6B 06 76 4B 60 94 F3 EC C9 AA E9 35&lt;br /&gt;
 17823	131.101569		Cmd 5: write ??? data 16 66 EA 7B 35 F6 71 A8 0A E0 D7 E7 45 E0 4F 23&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
Only the least significant byte is shown for each 32-bit data word, as the other bytes are always 0. The message content changes with each run of the vendor software. It&amp;#039;s hard to make head or tail of this. However, as this command is issued after all captured data has been retrieved, it cannot possibly affect the preceding capture and read-out operations.&lt;br /&gt;
&lt;br /&gt;
=== Command 0006: Read Memory at Address ===&lt;br /&gt;
&lt;br /&gt;
This command reads a chunk of data from the device memory (SRAM). It allows for random access using a 32-bit start address, and for variable length via a 32-bit length field. The software uses this command to read captured data from the device&amp;#039;s buffer.&lt;br /&gt;
&lt;br /&gt;
==== Command ====&lt;br /&gt;
&lt;br /&gt;
Fixed length of 5 words (10 bytes).&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;
!ID&lt;br /&gt;
!Address&lt;br /&gt;
!Length&lt;br /&gt;
|-&lt;br /&gt;
| 0006&lt;br /&gt;
| aaaa-aaaa&lt;br /&gt;
| nnnn-nnnn&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Both the address and the length are encoded in mixed endian (2-1-4-3) byte order.&lt;br /&gt;
&lt;br /&gt;
==== Response ====&lt;br /&gt;
&lt;br /&gt;
The memory is 36 bit wide, and thus the size of the response in bits is 36 times the value in the length field. The original vendor software reads chunks of 120 words @ 36 bit at a time, which works out to an integer multiple of 32 (i.e. 4320 bits = 135 32-bit words or 540 bytes). The final six reads are done in chunks of 8 words @ 36 bit, which works out to nine 32-bit words or 36 bytes. The overall amount of memory being read when fetching captured samples from a full buffer is just below the RAM size of 256k×36 bit.&lt;br /&gt;
&lt;br /&gt;
Note that the software always starts reading at address 4 rather than 0. Presumably, the firmware uses the first four 36-bit words for internal bookkeeping or some other purpose. Exception to the rule: For some unknown reason (perhaps testing), the memory is also being read on start-up right after loading the firmware into the FPGA. In this case, altogether 128000 36-bit words are being read beginning at address 0.&lt;br /&gt;
&lt;br /&gt;
Note that reading more than 1024 bytes at a time seems to be unreliable. Due to the constraints outlined in the following section, the maximum read length should therefore be restricted to 224 device words, which works out to 1008 bytes.&lt;br /&gt;
&lt;br /&gt;
===== 36-to-32 Bit Mapping =====&lt;br /&gt;
&lt;br /&gt;
The data returned by the read command consists of 32-bit words in 2-1-4-3 mixed endian byte order. Eight consecutive 36-bit words from the SRAM are mapped at a time to nine consecutive 32-bit words in the received stream. The first of these slices aligns to the beginning of the read-out stream, apparently irrespective of the absolute start address of the read operation.&lt;br /&gt;
&lt;br /&gt;
The first eight 32-bit words in a slice contain the lower 32 bit of the eight encoded 36-bit words. The ninth 32-bit word contains the four remaining high bits of all eight 36-bit words combined. The high nibbles are shifted into the ninth word from right to left, resulting in a 1-2-3-4-5-6-7-8 order of nibbles. (This is after conversion from mixed endian byte order!)&lt;br /&gt;
&lt;br /&gt;
As it is necessary to access the ninth 32-bit word in each slice even to fully extract the first 36-bit word, it follows that memory reads should always request a multiple of the slice length, i.e. eight 36-bit words. The length of the response will thus always be a multiple of nine 32-bit words (36 bytes). However, it does not appear to be necessary to restrict read operations to only the two lengths 120 and 8 used by the vendor software.&lt;br /&gt;
&lt;br /&gt;
===== Compression Scheme =====&lt;br /&gt;
&lt;br /&gt;
The compression scheme is a form of run-length encoding. Very short run lengths of only one or two cycles are handled as special cases, which helps to keep the worst-case overhead of compression pretty low. In particular, the scheme ensures that it is never necessary to write more than one 36-bit word per sampling cycle to the SRAM buffer.&lt;br /&gt;
&lt;br /&gt;
Each 36-bit word in the stream is either a data word or a repeat half-count word. The first word in the stream is a data word, with the following layout:&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;
!Bit&lt;br /&gt;
!35&lt;br /&gt;
!34&lt;br /&gt;
!33&lt;br /&gt;
!32&lt;br /&gt;
!31&lt;br /&gt;
!...&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
!Meaning&lt;br /&gt;
| Repeat count follows&lt;br /&gt;
| LSB of repeat count&lt;br /&gt;
| CH34&lt;br /&gt;
| CH33&lt;br /&gt;
| CH32&lt;br /&gt;
| ...&lt;br /&gt;
| CH3&lt;br /&gt;
| CH2&lt;br /&gt;
| CH1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
If bit 35 is set, then the next 36-bit word in the stream encodes the number of cycles the previous data word is repeated, divided by two. The actual number of repeat cycles is twice that number plus the LSB of repeat count, i.e. bit 34 from the data word. If bit 35 is not set the next word is again a data word and the repeat half-count is assumed as zero. However, the LSB of repeat count bit still applies; i.e. if it is set then the repeat count would be 1.&lt;br /&gt;
&lt;br /&gt;
So, to recap, repeat counts 0 to 1 are encoded as part of the channel data word, larger repeat counts use up a full extra 36-bit word. The combined repeat count is then 37 bit wide. At 125 MHz, this scheme would allow for encoding run lengths of more than 18 minutes. However, note that the vendor software does not actually make use of the full range: Apparently, it stops as soon as the count rolls over into bit 36, thereby cutting the maximum possible run length in half (i.e. about 9 minutes at 125 MHz). However, this detail does not make any difference for the decompression algorithm.&lt;br /&gt;
&lt;br /&gt;
The next word following a repeat half-count is again a data word. Note that it is possible for a sample/run-length pair to be split across a slice boundary, or even across successive read chunks. The decoder therefore needs to keep track of RLE state across slices as well as read operations.&lt;br /&gt;
&lt;br /&gt;
=== Command 0007: Write Long Registers ===&lt;br /&gt;
&lt;br /&gt;
This command writes several long registers in bulk. The long registers are 64 bit wide and use their own address space separate from the 32-bit control registers.&lt;br /&gt;
&lt;br /&gt;
The vendor software issues this command once during start-up, and once for each capture operation as part of the setup sequence. It is also issued when clicking the Stop button to cancel a capture in progress.&lt;br /&gt;
&lt;br /&gt;
==== Command ====&lt;br /&gt;
&lt;br /&gt;
Variable length of 3 words (6 bytes) plus length × 4 words (8 bytes).&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;
!ID&lt;br /&gt;
!Address&lt;br /&gt;
!Length&lt;br /&gt;
!Data&lt;br /&gt;
!...&lt;br /&gt;
|-&lt;br /&gt;
| 0007&lt;br /&gt;
| aaaa&lt;br /&gt;
| nnnn&lt;br /&gt;
| dddd-dddd-dddd-dddd&lt;br /&gt;
| ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The two argument words are the start address and the length of the slice to write, in little endian byte order. Both the address and the length refer to quantities of 64 bit (4 words or 8 bytes). Thus, if length is 10 the payload should consist of 40 words or 80 bytes.&lt;br /&gt;
&lt;br /&gt;
The vendor software always writes a slice of length 10 beginning at address 0, thus completely resetting both the capture configuration as well as the capture status. See the table of long registers for a description of the configuration and status fields.&lt;br /&gt;
&lt;br /&gt;
=== Command 0008: Read Long Registers ===&lt;br /&gt;
&lt;br /&gt;
This command reads several long registers in bulk. The long registers are 64 bit wide and use their own address space separate from the 32-bit control registers.&lt;br /&gt;
&lt;br /&gt;
The software uses this command mainly to read the block of capture status registers. During idle periods, the original vendor software polls the channel state about 34 times per second for its live port status display. During a capture operation, it is necessary to poll the status in order to find out whether the capture buffer has been filled completely and samples can be retrieved.&lt;br /&gt;
&lt;br /&gt;
==== Command ====&lt;br /&gt;
&lt;br /&gt;
Fixed length of 3 words (6 bytes).&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;
!ID&lt;br /&gt;
!Address&lt;br /&gt;
!Length&lt;br /&gt;
|-&lt;br /&gt;
| 0008&lt;br /&gt;
| aaaa&lt;br /&gt;
| nnnn&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The two argument words are the start address and the length of the slice to read, in little endian byte order. Both the address and the length refer to quantities of 64 bit (4 words or 8 bytes). Thus, if length is 10 the reply will consist of 40 words or 80 bytes.&lt;br /&gt;
&lt;br /&gt;
Although the vendor software always reads the full 10 fields of configuration and status information, it does not seem to be an actual requirement. Restricting reads to fields 5 to 9 in the sigrok driver works fine so far without any problems.&lt;br /&gt;
&lt;br /&gt;
==== Response ====&lt;br /&gt;
&lt;br /&gt;
Each returned 64-bit word is in very much mixed up (6-5-8-7-2-1-4-3) byte order. See the table of long registers for the meaning of the values at each address.&lt;br /&gt;
&lt;br /&gt;
== Control Registers ==&lt;br /&gt;
&lt;br /&gt;
The device exposes a number of 32-bit wide registers accessed via commands 1 and 2. Some of the register addresses appearing in the protocol also occur in the LWLA1016 protocol, although it seems that their purpose may not be the same. Other registers appear to be specific to the LWLA1034.&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;
!Address&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
| 1074&lt;br /&gt;
| MEM_CTRL&lt;br /&gt;
| Control register for capture memory access.&lt;br /&gt;
|-&lt;br /&gt;
| 1078&lt;br /&gt;
| MEM_FILL&lt;br /&gt;
| Compressed size of captured data (number of 36-bit words).&lt;br /&gt;
|-&lt;br /&gt;
| 107C&lt;br /&gt;
| MEM_ADDR?&lt;br /&gt;
| Not clear if this is an address or another control register, or even if it is needed at all.&lt;br /&gt;
|-&lt;br /&gt;
| 1090&lt;br /&gt;
| TEST?&lt;br /&gt;
| Writing 1 to this register apparently enables some sort of test mode.&lt;br /&gt;
|-&lt;br /&gt;
| 1094&lt;br /&gt;
| DIV_BYPASS&lt;br /&gt;
| This is set to 0 when using the internal clock with sampling rates of 100 MHz and below. For 125 MHz internal clock or the external clock modes, it is set to 1.&lt;br /&gt;
|-&lt;br /&gt;
| 10B0&lt;br /&gt;
| LONG_STROBE&lt;br /&gt;
| Long register read/write strobe.&lt;br /&gt;
|-&lt;br /&gt;
| 10B4&lt;br /&gt;
| LONG_ADDR&lt;br /&gt;
| Long register address.&lt;br /&gt;
|-&lt;br /&gt;
| 10B8&lt;br /&gt;
| LONG_LOW&lt;br /&gt;
| Long register low word.&lt;br /&gt;
|-&lt;br /&gt;
| 10BC&lt;br /&gt;
| LONG_HIGH&lt;br /&gt;
| Long register high word.&lt;br /&gt;
|-&lt;br /&gt;
| 10C0&lt;br /&gt;
| FREQ_CH1&lt;br /&gt;
|rowspan=&amp;quot;4&amp;quot;|&lt;br /&gt;
These registers apparently count the number of rising (or falling?) clock edges on channels 1 to 4. The vendor software polls these counters every second to display a live frequency count for the first four channels.&lt;br /&gt;
&lt;br /&gt;
It is unclear what time base is being used for those counters: The large error (sometimes by more than 20%, especially for CH1) hints at I/O latency, which would imply that the software resets the counters. However, manual testing of single register reads has shown that the values do not seem to scale with the time between reads. This would mean the device is using an internal time base after all. However, that makes the large error a bit hard to explain, especially since the error is different for each channel despite being driven by the same signal source.&lt;br /&gt;
|-&lt;br /&gt;
| 10C4&lt;br /&gt;
| FREQ_CH2&lt;br /&gt;
|-&lt;br /&gt;
| 10C8&lt;br /&gt;
| FREQ_CH3&lt;br /&gt;
|-&lt;br /&gt;
| 10CC&lt;br /&gt;
| FREQ_CH4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Long Registers ===&lt;br /&gt;
&lt;br /&gt;
These are separate 64-bit wide registers mainly used for capture control and status reporting. Single values can be read or written indirectly via special control registers. Commands 7 and 8 can be used to read or write multiple 64-bit values in a single command.&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;
!Index&lt;br /&gt;
!Purpose&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| Channel enable mask&lt;br /&gt;
| Bit mask of enabled channels. Bit 0 (LSB) corresponds to channel 1.&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| Clock divider count&lt;br /&gt;
| Max value of the counter which divides the internal clock to yield the sampling clock, for sampling rates of 100 MS/s or less. The value is calculated as 1 / (samplefreq * 10ns) - 1.&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| Trigger level mask&lt;br /&gt;
| Each bit corresponds to a channel, selecting whether to trigger on low/falling (0) or high/rising (1).&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| Trigger edge mask&lt;br /&gt;
| Each bit corresponds to a channel, selecting whether to trigger on level (0) or edge (1).&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| Trigger enable mask&lt;br /&gt;
| Each bit corresponds to a channel, selecting whether the trigger is enabled (1) or disabled (0).&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| Capture memory fill level&lt;br /&gt;
| On write, the value limits the (compressed) size of the captured data. On read, the current memory fill level is returned.&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| Not used?&lt;br /&gt;
| Apparently unused.&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| Running capture duration&lt;br /&gt;
| Time passed since the first sample. For samplerates up to 100 MS/s, the value is a duration in milliseconds. At 125 MS/s, the value needs to be adjusted by 100/125 = 4/5.&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| Channel input state&lt;br /&gt;
| Each bit corresponds to a channel, showing whether the input signal is currently low (0) or high (1).&lt;br /&gt;
|-&lt;br /&gt;
| 9&lt;br /&gt;
| Capture status flags&lt;br /&gt;
| A bit vector of status flags, as described in the next section. Only the lowest 6 bits appear to be valid, the remaining ones may contain garbage.&lt;br /&gt;
|-&lt;br /&gt;
| 10&lt;br /&gt;
| Capture control&lt;br /&gt;
| This appears to be a control register for starting and stopping data capture.&lt;br /&gt;
|-&lt;br /&gt;
| 100&lt;br /&gt;
| Test ID&lt;br /&gt;
| When read, the fixed value 0x1234567887654321 is returned. This is used for a sanity check during initialization.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The original vendor software uses the bulk read/write commands exclusively with the long registers 0 to 9. The long registers 10 and 100 are only ever accessed indirectly via the control registers 0x10B0 to 0x10BC.&lt;br /&gt;
&lt;br /&gt;
=== Capture Status Flags ===&lt;br /&gt;
&lt;br /&gt;
The status flag bits are used as follows:&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;
!Bit 0&lt;br /&gt;
!Bit 1&lt;br /&gt;
!Bit 2&lt;br /&gt;
!Bit 3&lt;br /&gt;
!Bit 4&lt;br /&gt;
!Bit 5&lt;br /&gt;
|-&lt;br /&gt;
| ???&lt;br /&gt;
| Capturing&lt;br /&gt;
| ???&lt;br /&gt;
| ???&lt;br /&gt;
| Triggered&lt;br /&gt;
| Memory available&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Task Recipes ==&lt;br /&gt;
&lt;br /&gt;
This section lists the commands issued by the software to perform a particular task.&lt;br /&gt;
&lt;br /&gt;
=== Long Register Read ===&lt;br /&gt;
&lt;br /&gt;
This sequence reads from a 64-bit wide internal memory, probably the same as that accessed by commands 7 and 8.&lt;br /&gt;
&lt;br /&gt;
# Write index to address register 0x10B4&lt;br /&gt;
# Read dummy value from strobe register 0x10B0&lt;br /&gt;
# Read high word from register 0x10BC&lt;br /&gt;
# Read low word from register 0x10B8&lt;br /&gt;
&lt;br /&gt;
Steps 3 and 4 appear to be interchangeable.&lt;br /&gt;
&lt;br /&gt;
=== Long Register Write ===&lt;br /&gt;
&lt;br /&gt;
This sequence writes to a 64-bit wide internal memory, probably the same as that accessed by commands 7 and 8.&lt;br /&gt;
&lt;br /&gt;
# Write index to address register 0x10B4&lt;br /&gt;
# Write low word to register 0x10B8&lt;br /&gt;
# Write high word to register 0x10BC&lt;br /&gt;
# Write 0 (dummy value) to strobe register 0x10B0&lt;br /&gt;
&lt;br /&gt;
Steps 2 and 3 appear to be interchangeable.&lt;br /&gt;
&lt;br /&gt;
=== Initialization ===&lt;br /&gt;
&lt;br /&gt;
# Acquire control of USB device and select configuration 1&lt;br /&gt;
# Send FPGA bitstream (default: internal clock) to EP 4 via bulk transfer&lt;br /&gt;
# Device test sequence:&lt;br /&gt;
## Read long register 100; ignore result&lt;br /&gt;
## Read long register 100; result should be 0x1234567887654321&lt;br /&gt;
# Capture setup/state test (vendor software does this, not mandatory):&lt;br /&gt;
## Write sequence 0..9 to capture setup fields (via command 7)&lt;br /&gt;
## Read back capture state (via command 8): 0..4 should be read back as is, 5..9 are trashed anyway&lt;br /&gt;
# Memory test (vendor software does this, not mandatory):&lt;br /&gt;
## Write 2 to register 0x1074&lt;br /&gt;
## Write 0 to register 0x107C&lt;br /&gt;
## Read memory beginning at address 0 in chunks of 120 36-bit words, up to but not including 0x013FB0&lt;br /&gt;
## Read memory beginning at address 0x013FB0 in chunks of 8 36-bit words, up to but not including 0x014000&lt;br /&gt;
&lt;br /&gt;
It does not seem to be necessary to use exactly the same read chunk length as the original vendor software. See the description of command 6 for constraints.&lt;br /&gt;
&lt;br /&gt;
=== Poll channel state ===&lt;br /&gt;
&lt;br /&gt;
The vendor software continuously polls the channel state even when idle. However, it is not mandatory to do so.&lt;br /&gt;
&lt;br /&gt;
# Poll frequency of signal at CH1 to CH4:&lt;br /&gt;
## Read register 0x10C0: value is frequency of CH1 signal&lt;br /&gt;
## Read register 0x10C4: value is frequency of CH2 signal&lt;br /&gt;
## Read register 0x10C8: value is frequency of CH3 signal&lt;br /&gt;
## Read register 0x10CC: value is frequency of CH4 signal&lt;br /&gt;
# Poll signal level of all channels:&lt;br /&gt;
## Read capture state (via command 8): the signal level of all channels is recorded in field 8&lt;br /&gt;
&lt;br /&gt;
=== Clocking Mode Switch ===&lt;br /&gt;
&lt;br /&gt;
# Transfer one of three FPGA bitstreams to EP 4:&lt;br /&gt;
## Configuration for internal clock&lt;br /&gt;
## Configuration for external clock, rising edge&lt;br /&gt;
## Configuration for external clock, falling edge&lt;br /&gt;
&lt;br /&gt;
=== Signal Capture ===&lt;br /&gt;
&lt;br /&gt;
# Write 2 to register 0x1074&lt;br /&gt;
# Write 1 to register 0x1074&lt;br /&gt;
# Write 0x74 to long register 10&lt;br /&gt;
# Write divider bypass flag to register 0x1094 (see description of register)&lt;br /&gt;
# Write capture setup (command 7, address 0, length 10: see description of command)&lt;br /&gt;
# Write 1 to long register 10&lt;br /&gt;
# Wait for capture to finish:&lt;br /&gt;
## Poll capture state (command 8, address 0, length 10: see description of command)&lt;br /&gt;
## Report progress information (got trigger, cycles elapsed, memory fill percentage) to user&lt;br /&gt;
## Capture has finished once the memory available flag is reset&lt;br /&gt;
&lt;br /&gt;
=== Cancel Signal Capture ===&lt;br /&gt;
&lt;br /&gt;
# Write 0 to long register 10&lt;br /&gt;
# Write 0 to register 0x1094 (divider bypass flag)&lt;br /&gt;
&lt;br /&gt;
After that, the memory available flag in the capture state should have been cleared. Continue in the same manner as for a regularly finished capture.&lt;br /&gt;
&lt;br /&gt;
=== Read Captured Data ===&lt;br /&gt;
&lt;br /&gt;
# Read register 0x1078: value is the number of 36-bit words in the capture buffer&lt;br /&gt;
# Write 1 to register 0x1094 (divider bypass flag)&lt;br /&gt;
# Write 2 to register 0x1074&lt;br /&gt;
# Write 4 to register 0x107C&lt;br /&gt;
# Read capture buffer:&lt;br /&gt;
## Read memory beginning at address 4 in chunks of 120 36-bit words, up to but not including 0x03FFC4&lt;br /&gt;
## Read memory beginning at address 0x03FFC4 in chunks of 8 36-bit words, up to but not including 0x03FFF4&lt;br /&gt;
# Write 0 to register 0x1094 (divider bypass flag)&lt;br /&gt;
# Issue mystery command 5 with mystery data, but for some mystical reason only for the first three captures after application start&lt;br /&gt;
&lt;br /&gt;
It does not seem to be necessary to use exactly the same read chunk length as the original vendor software. See the description of command 6 for constraints.&lt;br /&gt;
&lt;br /&gt;
The sigrok driver works fine without ever issuing mystery command 5.&lt;br /&gt;
&lt;br /&gt;
=== Shutdown ===&lt;br /&gt;
&lt;br /&gt;
1. Transfer FPGA configuration for device shutdown to EP 4&lt;/div&gt;</summary>
		<author><name>Danielk</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=Sysclk_LWLA1034/Protocol&amp;diff=11179</id>
		<title>Sysclk LWLA1034/Protocol</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=Sysclk_LWLA1034/Protocol&amp;diff=11179"/>
		<updated>2015-10-25T14:29:47Z</updated>

		<summary type="html">&lt;p&gt;Danielk: Move register documentation to separate section&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== FPGA Configuration ==&lt;br /&gt;
&lt;br /&gt;
The FPGA bitstream is loaded via bulk transfer to USB end point 4. Each firmware transfer starts with a 4-byte header to announce the transfer size. The payload appears to be a Raw Binary File (.rbf) with compression enabled.&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;
!Length&lt;br /&gt;
!Payload...&lt;br /&gt;
|-&lt;br /&gt;
| nnnn-nnnn&lt;br /&gt;
| dd...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Unlike the control commands, the firmware transfer is apparently byte-based. The length is a byte count encoded in big endian (1-2-3-4) byte order, and includes the size of the length field (4 bytes) itself.&lt;br /&gt;
&lt;br /&gt;
=== Application Behavior ===&lt;br /&gt;
&lt;br /&gt;
The vendor software transfers a new bitstream to the FPGA&lt;br /&gt;
# on application start,&lt;br /&gt;
# when switching clocking mode between internal, external/rising or external/falling,&lt;br /&gt;
# on application exit.&lt;br /&gt;
&lt;br /&gt;
The size of the bitstream varies due to compression, but is in the order of 50kB to 80kB. The firmware transfer is split by the vendor software into packets with 15 byte payload each and thus takes quite a bit of time inside VirtualBox. Testing with a libusb-based tool for issuing USB bulk transfers has shown that this does not appear to be necessary: Transferring even the entire firmware blob in a single bulk transfer appears to work without error.&lt;br /&gt;
=== Firmware Extraction ===&lt;br /&gt;
&lt;br /&gt;
The firmware blobs can be extracted directly from the Windows installer executable located on the CD-ROM that ships with the device.  The file &amp;lt;tt&amp;gt;lwla1034_EN_setup.exe&amp;lt;/tt&amp;gt; on the CD-ROM from 2012-07-12 has the firmware blobs located at the following offsets:&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;
!Offset&lt;br /&gt;
!Length&lt;br /&gt;
!Mode&lt;br /&gt;
|-&lt;br /&gt;
| 34110338&lt;br /&gt;
| 78398&lt;br /&gt;
| Internal clock&lt;br /&gt;
|-&lt;br /&gt;
| 34266237&lt;br /&gt;
| 78247&lt;br /&gt;
| External clock (rising edge)&lt;br /&gt;
|-&lt;br /&gt;
| 34344484&lt;br /&gt;
| 79145&lt;br /&gt;
| External clock (falling edge)&lt;br /&gt;
|-&lt;br /&gt;
| 34578631&lt;br /&gt;
| 48525&lt;br /&gt;
| Shutdown&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Both offsets and lengths are in bytes. The extracted blobs already include the header with the 32-bit length field.&lt;br /&gt;
&lt;br /&gt;
== Control Commands ==&lt;br /&gt;
&lt;br /&gt;
Control commands are sent via bulk transfer to USB end point 2, with the response (if any) coming in from end point 6.&lt;br /&gt;
&lt;br /&gt;
Command messages are sent to the device as a sequence of 16-bit words with little endian byte order. The first word in a message identifies the command type. Different command types have different message lengths. Some command types include a length field and allow for messages of variable length, others are of fixed size.&lt;br /&gt;
&lt;br /&gt;
There are read commands which trigger an immediate response from the device, and write commands without a response.&lt;br /&gt;
&lt;br /&gt;
=== Command 0001: Read Register ===&lt;br /&gt;
&lt;br /&gt;
This command reads a 32-bit wide control register.&lt;br /&gt;
&lt;br /&gt;
==== Command ====&lt;br /&gt;
&lt;br /&gt;
Fixed length of 2 words (4 bytes).&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;
!ID&lt;br /&gt;
!Address&lt;br /&gt;
|-&lt;br /&gt;
| 0001&lt;br /&gt;
| aaaa&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Response ====&lt;br /&gt;
&lt;br /&gt;
The response has a fixed length of 2 words (4 bytes). It is the content of a 32-bit register in mixed endian (2-1-4-3) byte order.&lt;br /&gt;
&lt;br /&gt;
=== Command 0002: Write Register ===&lt;br /&gt;
&lt;br /&gt;
This command writes a 32-bit value to a control register.&lt;br /&gt;
&lt;br /&gt;
==== Command ====&lt;br /&gt;
&lt;br /&gt;
Fixed length of 4 words (8 bytes).&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;
!ID&lt;br /&gt;
!Address&lt;br /&gt;
!Data&lt;br /&gt;
|-&lt;br /&gt;
| 0002&lt;br /&gt;
| aaaa&lt;br /&gt;
| dddd-dddd&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The value is encoded in mixed endian (2-1-4-3) byte order.&lt;br /&gt;
&lt;br /&gt;
=== Command 0005: Write ??? ===&lt;br /&gt;
&lt;br /&gt;
This command appears to write 16 32-bit words at once. The vendor software issues this after a transfer of captured data to the host has finished, but only for the first three captures. After that, the application needs to be restarted to ever see this command again.&lt;br /&gt;
&lt;br /&gt;
The data written varies each time, but it appears that only the lowest 8 bit of each 32-bit word are ever written. No idea what this might do. It could be calibration feedback or something, although it is hard to imagine how the host could help the device with that. Luckily, the sigrok driver works without ever sending this command at all.&lt;br /&gt;
&lt;br /&gt;
==== Command ====&lt;br /&gt;
&lt;br /&gt;
Fixed length of 33 words (66 bytes).&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;
!ID&lt;br /&gt;
!Data 1&lt;br /&gt;
!Data 2&lt;br /&gt;
!...&lt;br /&gt;
!Data 16&lt;br /&gt;
|-&lt;br /&gt;
| 0005&lt;br /&gt;
| dddd-dddd&lt;br /&gt;
| dddd-dddd&lt;br /&gt;
| ...&lt;br /&gt;
| dddd-dddd&lt;br /&gt;
|}&lt;br /&gt;
The byte order of each 32-bit word is most likely the usual 2-1-4-3 mixed endianess.&lt;br /&gt;
&lt;br /&gt;
==== Sample capture ====&lt;br /&gt;
&lt;br /&gt;
A sample of three such commands from an actual protocol analysis session:&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
 10185	56.455640		Cmd 5: write ??? data C3 9A 4B 91 30 D2 98 C1 CA F2 D7 4F 82 74 C0 8B&lt;br /&gt;
 14155	95.788766		Cmd 5: write ??? data E5 7B 2C F3 6B 06 76 4B 60 94 F3 EC C9 AA E9 35&lt;br /&gt;
 17823	131.101569		Cmd 5: write ??? data 16 66 EA 7B 35 F6 71 A8 0A E0 D7 E7 45 E0 4F 23&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
Only the least significant byte is shown for each 32-bit data word, as the other bytes are always 0. The message content changes with each run of the vendor software. It&amp;#039;s hard to make head or tail of this. However, as this command is issued after all captured data has been retrieved, it cannot possibly affect the preceding capture and read-out operations.&lt;br /&gt;
&lt;br /&gt;
=== Command 0006: Read Memory at Address ===&lt;br /&gt;
&lt;br /&gt;
This command reads a chunk of data from the device memory (SRAM). It allows for random access using a 32-bit start address, and for variable length via a 32-bit length field. The software uses this command to read captured data from the device&amp;#039;s buffer.&lt;br /&gt;
&lt;br /&gt;
==== Command ====&lt;br /&gt;
&lt;br /&gt;
Fixed length of 5 words (10 bytes).&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;
!ID&lt;br /&gt;
!Address&lt;br /&gt;
!Length&lt;br /&gt;
|-&lt;br /&gt;
| 0006&lt;br /&gt;
| aaaa-aaaa&lt;br /&gt;
| nnnn-nnnn&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Both the address and the length are encoded in mixed endian (2-1-4-3) byte order.&lt;br /&gt;
&lt;br /&gt;
==== Response ====&lt;br /&gt;
&lt;br /&gt;
The memory is 36 bit wide, and thus the size of the response in bits is 36 times the value in the length field. The original vendor software reads chunks of 120 words @ 36 bit at a time, which works out to an integer multiple of 32 (i.e. 4320 bits = 135 32-bit words or 540 bytes). The final six reads are done in chunks of 8 words @ 36 bit, which works out to nine 32-bit words or 36 bytes. The overall amount of memory being read when fetching captured samples from a full buffer is just below the RAM size of 256k×36 bit.&lt;br /&gt;
&lt;br /&gt;
Note that the software always starts reading at address 4 rather than 0. Presumably, the firmware uses the first four 36-bit words for internal bookkeeping or some other purpose. Exception to the rule: For some unknown reason (perhaps testing), the memory is also being read on start-up right after loading the firmware into the FPGA. In this case, altogether 128000 36-bit words are being read beginning at address 0.&lt;br /&gt;
&lt;br /&gt;
Note that reading more than 1024 bytes at a time seems to be unreliable. Due to the constraints outlined in the following section, the maximum read length should therefore be restricted to 224 device words, which works out to 1008 bytes.&lt;br /&gt;
&lt;br /&gt;
===== 36-to-32 Bit Mapping =====&lt;br /&gt;
&lt;br /&gt;
The data returned by the read command consists of 32-bit words in 2-1-4-3 mixed endian byte order. Eight consecutive 36-bit words from the SRAM are mapped at a time to nine consecutive 32-bit words in the received stream. The first of these slices aligns to the beginning of the read-out stream, apparently irrespective of the absolute start address of the read operation.&lt;br /&gt;
&lt;br /&gt;
The first eight 32-bit words in a slice contain the lower 32 bit of the eight encoded 36-bit words. The ninth 32-bit word contains the four remaining high bits of all eight 36-bit words combined. The high nibbles are shifted into the ninth word from right to left, resulting in a 1-2-3-4-5-6-7-8 order of nibbles. (This is after conversion from mixed endian byte order!)&lt;br /&gt;
&lt;br /&gt;
As it is necessary to access the ninth 32-bit word in each slice even to fully extract the first 36-bit word, it follows that memory reads should always request a multiple of the slice length, i.e. eight 36-bit words. The length of the response will thus always be a multiple of nine 32-bit words (36 bytes). However, it does not appear to be necessary to restrict read operations to only the two lengths 120 and 8 used by the vendor software.&lt;br /&gt;
&lt;br /&gt;
===== Compression Scheme =====&lt;br /&gt;
&lt;br /&gt;
The compression scheme is a form of run-length encoding. Very short run lengths of only one or two cycles are handled as special cases, which helps to keep the worst-case overhead of compression pretty low. In particular, the scheme ensures that it is never necessary to write more than one 36-bit word per sampling cycle to the SRAM buffer.&lt;br /&gt;
&lt;br /&gt;
Each 36-bit word in the stream is either a data word or a repeat half-count word. The first word in the stream is a data word, with the following layout:&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;
!Bit&lt;br /&gt;
!35&lt;br /&gt;
!34&lt;br /&gt;
!33&lt;br /&gt;
!32&lt;br /&gt;
!31&lt;br /&gt;
!...&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
!Meaning&lt;br /&gt;
| Repeat count follows&lt;br /&gt;
| LSB of repeat count&lt;br /&gt;
| CH34&lt;br /&gt;
| CH33&lt;br /&gt;
| CH32&lt;br /&gt;
| ...&lt;br /&gt;
| CH3&lt;br /&gt;
| CH2&lt;br /&gt;
| CH1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
If bit 35 is set, then the next 36-bit word in the stream encodes the number of cycles the previous data word is repeated, divided by two. The actual number of repeat cycles is twice that number plus the LSB of repeat count, i.e. bit 34 from the data word. If bit 35 is not set the next word is again a data word and the repeat half-count is assumed as zero. However, the LSB of repeat count bit still applies; i.e. if it is set then the repeat count would be 1.&lt;br /&gt;
&lt;br /&gt;
So, to recap, repeat counts 0 to 1 are encoded as part of the channel data word, larger repeat counts use up a full extra 36-bit word. The combined repeat count is then 37 bit wide. At 125 MHz, this scheme would allow for encoding run lengths of more than 18 minutes. However, note that the vendor software does not actually make use of the full range: Apparently, it stops as soon as the count rolls over into bit 36, thereby cutting the maximum possible run length in half (i.e. about 9 minutes at 125 MHz). However, this detail does not make any difference for the decompression algorithm.&lt;br /&gt;
&lt;br /&gt;
The next word following a repeat half-count is again a data word. Note that it is possible for a sample/run-length pair to be split across a slice boundary, or even across successive read chunks. The decoder therefore needs to keep track of RLE state across slices as well as read operations.&lt;br /&gt;
&lt;br /&gt;
=== Command 0007: Capture Setup ===&lt;br /&gt;
&lt;br /&gt;
This command prepares a capture operation. Essentially, this command appears to write to an internal memory block with 64-bit granularity. Command 0008 can be used to read from the same memory.&lt;br /&gt;
&lt;br /&gt;
The vendor software issues this command once during start-up, and once for each capture operation as part of the setup sequence. It is also issued when clicking the Stop button to cancel a capture in progress.&lt;br /&gt;
&lt;br /&gt;
==== Command ====&lt;br /&gt;
&lt;br /&gt;
Variable length of 3 words (6 bytes) plus length × 4 words (8 bytes).&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;
!ID&lt;br /&gt;
!Address&lt;br /&gt;
!Length&lt;br /&gt;
!Data&lt;br /&gt;
!...&lt;br /&gt;
|-&lt;br /&gt;
| 0007&lt;br /&gt;
| aaaa&lt;br /&gt;
| nnnn&lt;br /&gt;
| dddd-dddd-dddd-dddd&lt;br /&gt;
| ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The two argument words are the start address and the length of the slice to write, in little endian byte order. Both the address and the length refer to quantities of 64 bit (4 words or 8 bytes). Thus, if length is 10 the payload should consist of 40 words or 80 bytes.&lt;br /&gt;
&lt;br /&gt;
The vendor software always writes a slice of length 10 beginning at address 0, thus completely resetting both the capture configuration as well as the capture status. The layout of the configuration and status memory is outlined in the description of command 0008.&lt;br /&gt;
&lt;br /&gt;
=== Command 0008: Capture Status ===&lt;br /&gt;
&lt;br /&gt;
This command reads the current capture configuration and status. Essentially, this command appears to read a slice from an internal memory block with 64-bit granularity -- the same memory space command 7 writes to. During idle periods, the software polls the channel state about 34 times per second for its live port status display. During a capture operation, it is necessary to poll the status in order to find out whether the capture buffer has been filled completely and samples can be retrieved.&lt;br /&gt;
&lt;br /&gt;
==== Command ====&lt;br /&gt;
&lt;br /&gt;
Fixed length of 3 words (6 bytes).&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;
!ID&lt;br /&gt;
!Address&lt;br /&gt;
!Length&lt;br /&gt;
|-&lt;br /&gt;
| 0008&lt;br /&gt;
| aaaa&lt;br /&gt;
| nnnn&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The two argument words are the start address and the length of the slice to read, in little endian byte order. Both the address and the length refer to quantities of 64 bit (4 words or 8 bytes). Thus, if length is 10 the reply will consist of 40 words or 80 bytes.&lt;br /&gt;
&lt;br /&gt;
Although the vendor software always reads the full 10 fields of configuration and status information, it does not seem to be an actual requirement. Restricting reads to fields 5 to 9 in the sigrok driver works fine so far without any problems.&lt;br /&gt;
&lt;br /&gt;
==== Response ====&lt;br /&gt;
&lt;br /&gt;
The table below shows the response to the command as issued by the vendor software, i.e. with start address 0 and length 10. Each row is a 64-bit word in very much mixed up (6-5-8-7-2-1-4-3) byte order. Roughly, the first half is used to set up a capture operation, whereas the second half contains status information. Field 5 is an exception, as it is used for both setup and status.&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;
!Index&lt;br /&gt;
!Byte offset&lt;br /&gt;
!Value&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 00&lt;br /&gt;
| Channel enable mask&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 08&lt;br /&gt;
| Clock divider count&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 10&lt;br /&gt;
| Trigger level mask&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| 18&lt;br /&gt;
| Trigger edge mask&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 20&lt;br /&gt;
| Trigger enable mask&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| 28&lt;br /&gt;
| Capture memory fill level&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| 30&lt;br /&gt;
| Not used?&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| 38&lt;br /&gt;
| Running capture duration&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 40&lt;br /&gt;
| Channel input state&lt;br /&gt;
|-&lt;br /&gt;
| 9&lt;br /&gt;
| 48&lt;br /&gt;
| Capture status flags&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The channel enable mask and the input state are bit vectors, with bit 0 of the 64-bit word (after unmixing the byte order!) corresponding to CH1 and bit 33 corresponding to CH34. The enable mask shows which channels have been enabled for capturing. The bits in the input state vector signify whether the voltage at the corresponding input channels is currently low (0) or high (1).&lt;br /&gt;
&lt;br /&gt;
Field 1 sets the max value of the counter which divides the internal clock to yield the sampling clock. This applies to all sample rates of 100MHz or less (125MHz is a special case: see control register 1094). The counter max value is calculated as follows: maxcount = 1 / (samplefreq * 10ns) - 1&lt;br /&gt;
&lt;br /&gt;
Field 4 is the trigger enable mask. 1 enables triggering on a channel, 0 disables it. CH1 is mapped to bit 0 and CH34 to bit 33. Bits 34 and 35 are special and configure for external triggering. Bit 34 enables external triggering on the falling edge, bit 35 on the rising edge.&lt;br /&gt;
&lt;br /&gt;
If a trigger channel is enabled, the corresponding bit in field 3 configures whether to trigger on level (0) or edge (1). The corresponding bit in field 2 then selects whether to trigger on low/falling (0) or high/rising (1).&lt;br /&gt;
&lt;br /&gt;
During setup, field 5 is used to limit the (compressed) size of the captured data. During a running capture operation, field 5 indicates the current memory fill level.&lt;br /&gt;
&lt;br /&gt;
Field 7 is the time passed since the first sample. For samplerates up to 100 MHz, the value is a duration in milliseconds. The 125 MHz setting is again special and uses the same timebase as the 100 MHz setting, i.e. field 7 can then be interpreted as the sample count × 10&amp;lt;sup&amp;gt;−5&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Field 8 records a snapshot of the signal level of all 34 channels at the time the status is being read.&lt;br /&gt;
&lt;br /&gt;
Field 6 appears to be unused.&lt;br /&gt;
&lt;br /&gt;
===== Capture Status Flags =====&lt;br /&gt;
&lt;br /&gt;
The status flag bits are used as follows:&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;
!Bit 0&lt;br /&gt;
!Bit 1&lt;br /&gt;
!Bit 2&lt;br /&gt;
!Bit 3&lt;br /&gt;
!Bit 4&lt;br /&gt;
!Bit 5&lt;br /&gt;
|-&lt;br /&gt;
| ???&lt;br /&gt;
| Capturing&lt;br /&gt;
| ???&lt;br /&gt;
| ???&lt;br /&gt;
| Triggered&lt;br /&gt;
| Memory available&lt;br /&gt;
|}&lt;br /&gt;
The higher bits of field 9 appear to contain garbage (apparently copies of the bits from field 8).&lt;br /&gt;
&lt;br /&gt;
== Control Registers ==&lt;br /&gt;
&lt;br /&gt;
The device exposes a number of 32-bit wide registers accessed via commands 1 and 2. Some of the register addresses appearing in the protocol also occur in the LWLA1016 protocol, although it seems that their purpose may not be the same. Other registers appear to be specific to the LWLA1034.&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;
!Address&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
| 1074&lt;br /&gt;
| MEM_CTRL&lt;br /&gt;
| Control register for capture memory access.&lt;br /&gt;
|-&lt;br /&gt;
| 1078&lt;br /&gt;
| MEM_FILL&lt;br /&gt;
| Compressed size of captured data (number of 36-bit words).&lt;br /&gt;
|-&lt;br /&gt;
| 107C&lt;br /&gt;
| MEM_ADDR?&lt;br /&gt;
| Not clear if this is an address or another control register, or even if it is needed at all.&lt;br /&gt;
|-&lt;br /&gt;
| 1090&lt;br /&gt;
| TEST?&lt;br /&gt;
| Writing 1 to this register apparently enables some sort of test mode.&lt;br /&gt;
|-&lt;br /&gt;
| 1094&lt;br /&gt;
| DIV_BYPASS&lt;br /&gt;
| This is set to 0 when using the internal clock with sampling rates of 100 MHz and below. For 125 MHz internal clock or the external clock modes, it is set to 1.&lt;br /&gt;
|-&lt;br /&gt;
| 10B0&lt;br /&gt;
| LONG_STROBE&lt;br /&gt;
| Long register read/write strobe.&lt;br /&gt;
|-&lt;br /&gt;
| 10B4&lt;br /&gt;
| LONG_ADDR&lt;br /&gt;
| Long register address.&lt;br /&gt;
|-&lt;br /&gt;
| 10B8&lt;br /&gt;
| LONG_LOW&lt;br /&gt;
| Long register low word.&lt;br /&gt;
|-&lt;br /&gt;
| 10BC&lt;br /&gt;
| LONG_HIGH&lt;br /&gt;
| Long register high word.&lt;br /&gt;
|-&lt;br /&gt;
| 10C0&lt;br /&gt;
| FREQ_CH1&lt;br /&gt;
|rowspan=&amp;quot;4&amp;quot;|&lt;br /&gt;
These registers apparently count the number of rising (or falling?) clock edges on channels 1 to 4. The vendor software polls these counters every second to display a live frequency count for the first four channels.&lt;br /&gt;
&lt;br /&gt;
It is unclear what time base is being used for those counters: The large error (sometimes by more than 20%, especially for CH1) hints at I/O latency, which would imply that the software resets the counters. However, manual testing of single register reads has shown that the values do not seem to scale with the time between reads. This would mean the device is using an internal time base after all. However, that makes the large error a bit hard to explain, especially since the error is different for each channel despite being driven by the same signal source.&lt;br /&gt;
|-&lt;br /&gt;
| 10C4&lt;br /&gt;
| FREQ_CH2&lt;br /&gt;
|-&lt;br /&gt;
| 10C8&lt;br /&gt;
| FREQ_CH3&lt;br /&gt;
|-&lt;br /&gt;
| 10CC&lt;br /&gt;
| FREQ_CH4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Task Recipes ==&lt;br /&gt;
&lt;br /&gt;
This section lists the commands issued by the software to perform a particular task.&lt;br /&gt;
&lt;br /&gt;
=== Long Register Read ===&lt;br /&gt;
&lt;br /&gt;
This sequence reads from a 64-bit wide internal memory, probably the same as that accessed by commands 7 and 8.&lt;br /&gt;
&lt;br /&gt;
# Write index to address register 0x10B4&lt;br /&gt;
# Read dummy value from strobe register 0x10B0&lt;br /&gt;
# Read high word from register 0x10BC&lt;br /&gt;
# Read low word from register 0x10B8&lt;br /&gt;
&lt;br /&gt;
Steps 3 and 4 appear to be interchangeable.&lt;br /&gt;
&lt;br /&gt;
=== Long Register Write ===&lt;br /&gt;
&lt;br /&gt;
This sequence writes to a 64-bit wide internal memory, probably the same as that accessed by commands 7 and 8.&lt;br /&gt;
&lt;br /&gt;
# Write index to address register 0x10B4&lt;br /&gt;
# Write low word to register 0x10B8&lt;br /&gt;
# Write high word to register 0x10BC&lt;br /&gt;
# Write 0 (dummy value) to strobe register 0x10B0&lt;br /&gt;
&lt;br /&gt;
Steps 2 and 3 appear to be interchangeable.&lt;br /&gt;
&lt;br /&gt;
=== Initialization ===&lt;br /&gt;
&lt;br /&gt;
# Acquire control of USB device and select configuration 1&lt;br /&gt;
# Send FPGA bitstream (default: internal clock) to EP 4 via bulk transfer&lt;br /&gt;
# Device test sequence:&lt;br /&gt;
## Read long register 100; ignore result&lt;br /&gt;
## Read long register 100; result should be 0x1234567887654321&lt;br /&gt;
# Capture setup/state test (vendor software does this, not mandatory):&lt;br /&gt;
## Write sequence 0..9 to capture setup fields (via command 7)&lt;br /&gt;
## Read back capture state (via command 8): 0..4 should be read back as is, 5..9 are trashed anyway&lt;br /&gt;
# Memory test (vendor software does this, not mandatory):&lt;br /&gt;
## Write 2 to register 0x1074&lt;br /&gt;
## Write 0 to register 0x107C&lt;br /&gt;
## Read memory beginning at address 0 in chunks of 120 36-bit words, up to but not including 0x013FB0&lt;br /&gt;
## Read memory beginning at address 0x013FB0 in chunks of 8 36-bit words, up to but not including 0x014000&lt;br /&gt;
&lt;br /&gt;
It does not seem to be necessary to use exactly the same read chunk length as the original vendor software. See the description of command 6 for constraints.&lt;br /&gt;
&lt;br /&gt;
=== Poll channel state ===&lt;br /&gt;
&lt;br /&gt;
The vendor software continuously polls the channel state even when idle. However, it is not mandatory to do so.&lt;br /&gt;
&lt;br /&gt;
# Poll frequency of signal at CH1 to CH4:&lt;br /&gt;
## Read register 0x10C0: value is frequency of CH1 signal&lt;br /&gt;
## Read register 0x10C4: value is frequency of CH2 signal&lt;br /&gt;
## Read register 0x10C8: value is frequency of CH3 signal&lt;br /&gt;
## Read register 0x10CC: value is frequency of CH4 signal&lt;br /&gt;
# Poll signal level of all channels:&lt;br /&gt;
## Read capture state (via command 8): the signal level of all channels is recorded in field 8&lt;br /&gt;
&lt;br /&gt;
=== Clocking Mode Switch ===&lt;br /&gt;
&lt;br /&gt;
# Transfer one of three FPGA bitstreams to EP 4:&lt;br /&gt;
## Configuration for internal clock&lt;br /&gt;
## Configuration for external clock, rising edge&lt;br /&gt;
## Configuration for external clock, falling edge&lt;br /&gt;
&lt;br /&gt;
=== Signal Capture ===&lt;br /&gt;
&lt;br /&gt;
# Write 2 to register 0x1074&lt;br /&gt;
# Write 1 to register 0x1074&lt;br /&gt;
# Write 0x74 to long register 10&lt;br /&gt;
# Write divider bypass flag to register 0x1094 (see description of register)&lt;br /&gt;
# Write capture setup (command 7, address 0, length 10: see description of command)&lt;br /&gt;
# Write 1 to long register 10&lt;br /&gt;
# Wait for capture to finish:&lt;br /&gt;
## Poll capture state (command 8, address 0, length 10: see description of command)&lt;br /&gt;
## Report progress information (got trigger, cycles elapsed, memory fill percentage) to user&lt;br /&gt;
## Capture has finished once the memory available flag is reset&lt;br /&gt;
&lt;br /&gt;
=== Cancel Signal Capture ===&lt;br /&gt;
&lt;br /&gt;
# Write 0 to long register 10&lt;br /&gt;
# Write 0 to register 0x1094 (divider bypass flag)&lt;br /&gt;
&lt;br /&gt;
After that, the memory available flag in the capture state should have been cleared. Continue in the same manner as for a regularly finished capture.&lt;br /&gt;
&lt;br /&gt;
=== Read Captured Data ===&lt;br /&gt;
&lt;br /&gt;
# Read register 0x1078: value is the number of 36-bit words in the capture buffer&lt;br /&gt;
# Write 1 to register 0x1094 (divider bypass flag)&lt;br /&gt;
# Write 2 to register 0x1074&lt;br /&gt;
# Write 4 to register 0x107C&lt;br /&gt;
# Read capture buffer:&lt;br /&gt;
## Read memory beginning at address 4 in chunks of 120 36-bit words, up to but not including 0x03FFC4&lt;br /&gt;
## Read memory beginning at address 0x03FFC4 in chunks of 8 36-bit words, up to but not including 0x03FFF4&lt;br /&gt;
# Write 0 to register 0x1094 (divider bypass flag)&lt;br /&gt;
# Issue mystery command 5 with mystery data, but for some mystical reason only for the first three captures after application start&lt;br /&gt;
&lt;br /&gt;
It does not seem to be necessary to use exactly the same read chunk length as the original vendor software. See the description of command 6 for constraints.&lt;br /&gt;
&lt;br /&gt;
The sigrok driver works fine without ever issuing mystery command 5.&lt;br /&gt;
&lt;br /&gt;
=== Shutdown ===&lt;br /&gt;
&lt;br /&gt;
1. Transfer FPGA configuration for device shutdown to EP 4&lt;/div&gt;</summary>
		<author><name>Danielk</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=Sysclk_LWLA1016/Protocol&amp;diff=11178</id>
		<title>Sysclk LWLA1016/Protocol</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=Sysclk_LWLA1016/Protocol&amp;diff=11178"/>
		<updated>2015-10-25T13:26:46Z</updated>

		<summary type="html">&lt;p&gt;Danielk: Move register documentation to separate section&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The basic structure of the SysClk LWLA1016 protocol is similar to the [[Sysclk LWLA1034/Protocol]]. As one would expect, it looks very much like an earlier iteration of the LWLA1034 protocol. It appears to lack the specialized commands the LWLA1034 has for reading memory and capture setup/status. Most of the functionality seems to be implemented on top of basic register reads and writes, using the same commands as the LWLA1034 for those.&lt;br /&gt;
&lt;br /&gt;
== FPGA Configuration ==&lt;br /&gt;
&lt;br /&gt;
As with the LWLA1034, the FPGA bitstream is loaded via bulk transfer to USB end point 4. The format seems to be exactly the same, too.&lt;br /&gt;
&lt;br /&gt;
The Windows software ships four separate executables: One for running with 16 channels at up to 100 MSps, one for 8 channels at up to 200 MSps, and one for 8 channels at 250 MSps. A fourth executable runs the LWLA1016 in frequency counter mode. Each of the executables downloads its own bitstream to the FPGA.&lt;br /&gt;
&lt;br /&gt;
=== Application Behavior ===&lt;br /&gt;
&lt;br /&gt;
The vendor software transfers a new bitstream to the FPGA&lt;br /&gt;
# on application start,&lt;br /&gt;
# ... (TODO).&lt;br /&gt;
&lt;br /&gt;
Selecting specific device configurations may require downloading other bitstream variants to the device. TODO: Make sure all modes are covered.&lt;br /&gt;
&lt;br /&gt;
=== Firmware Extraction ===&lt;br /&gt;
&lt;br /&gt;
The FPGA bitstreams are stored in RBF (Raw Binary File) format, as with the LWLA1034. The bitstreams can be extracted from various DLLs installed with the Windows software (an extraction tool will be provided until we get permission to distribute the firmware). Unfortunately, unlike with the LWLA1034, the LWLA1016 firmware cannot be easily extracted from the installer executable without installing the software first.&lt;br /&gt;
&lt;br /&gt;
There are six different FPGA bitstreams for the various LA modes: 3 frequency modes times 2 compression modes. In the vendor&amp;#039;s terminology, &amp;quot;Timing-State&amp;quot; is the mode with compression enabled and &amp;quot;Normal&amp;quot; is the mode without compression.&lt;br /&gt;
&lt;br /&gt;
== Control Commands ==&lt;br /&gt;
&lt;br /&gt;
As with the LWLA1034, control commands are sent via bulk transfer to USB end point 2, with the response (if any) coming in from end point 6.&lt;br /&gt;
&lt;br /&gt;
For the most part, the LWLA1016 protocol seems to consist of basic register read and write commands. Unlike with the LWLA1034, it looks like capture setup, capture status polling and reading from memory are implemented on top of simple register reads and writes.&lt;br /&gt;
&lt;br /&gt;
=== Command 0001: Read Register ===&lt;br /&gt;
&lt;br /&gt;
This command reads a 32-bit wide control register. It appears to be identical to [[Sysclk_LWLA1034/Protocol#Command_0001:_Read_Register|command 1 in the LWLA1034 protocol]].&lt;br /&gt;
&lt;br /&gt;
==== Command ====&lt;br /&gt;
&lt;br /&gt;
Fixed length of 2 words (4 bytes).&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;
!ID&lt;br /&gt;
!Address&lt;br /&gt;
|-&lt;br /&gt;
| 0001&lt;br /&gt;
| aaaa&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Response ====&lt;br /&gt;
&lt;br /&gt;
The response has a fixed length of 2 words (4 bytes). It is the content of a 32-bit register in mixed endian (2-1-4-3) byte order.&lt;br /&gt;
&lt;br /&gt;
=== Command 0002: Write Register ===&lt;br /&gt;
&lt;br /&gt;
This command writes a 32-bit value to a control register. It appears to be identical to [[Sysclk_LWLA1034/Protocol#Command_0002:_Write_Register|command 2 in the LWLA1034 protocol]].&lt;br /&gt;
&lt;br /&gt;
==== Command ====&lt;br /&gt;
&lt;br /&gt;
Fixed length of 4 words (8 bytes).&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;
!ID&lt;br /&gt;
!Address&lt;br /&gt;
!Data&lt;br /&gt;
|-&lt;br /&gt;
| 0002&lt;br /&gt;
| aaaa&lt;br /&gt;
| dddd-dddd&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The value is encoded in mixed endian (2-1-4-3) byte order.&lt;br /&gt;
&lt;br /&gt;
=== Command 0003: Read Memory at Address ===&lt;br /&gt;
&lt;br /&gt;
This command reads the captured samples from the device. It works very much like command 6 in the LWLA1034 protocol.&lt;br /&gt;
&lt;br /&gt;
==== Command ====&lt;br /&gt;
&lt;br /&gt;
Fixed length of 5 words (10 bytes).&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;
!ID&lt;br /&gt;
!Address&lt;br /&gt;
!Length&lt;br /&gt;
|-&lt;br /&gt;
| 0003&lt;br /&gt;
| aaaa-aaaa&lt;br /&gt;
| nnnn-nnnn&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Both the address and the length are encoded in mixed endian (2-1-4-3) byte order.&lt;br /&gt;
&lt;br /&gt;
==== Response ====&lt;br /&gt;
&lt;br /&gt;
The memory is 32 bit wide, and thus the size of the response in bits is 32 times the value in the length field. The original vendor software reads chunks of 250 words @ 32 bit at a time, i.e. 1000 bytes. Note that the software always starts reading at address 2 rather than 0.&lt;br /&gt;
&lt;br /&gt;
===== Compression Scheme =====&lt;br /&gt;
&lt;br /&gt;
In timing-state mode a very simple form of run-length encoding is used. Each 32-bit unit of memory holds 2 Little Endian values. The 16-bit word  at the lower address is the repeat count for the channel state encoded in the subsequent 16-bit word.&lt;br /&gt;
&lt;br /&gt;
=== Command 0005: Write ??? ===&lt;br /&gt;
&lt;br /&gt;
This command appears to have the same format and function as command 5 sent by the original LWLA1034 firmware. That means we can probably ignore it, just as with the LWLA1034.&lt;br /&gt;
&lt;br /&gt;
==== Command ====&lt;br /&gt;
&lt;br /&gt;
Fixed length of 33 words (66 bytes).&lt;br /&gt;
&lt;br /&gt;
== Control Registers ==&lt;br /&gt;
&lt;br /&gt;
The device exposes a number of 32-bit wide registers accessed via commands 1 and 2. Some of the register addresses appearing in the protocol also occur in the LWLA1034 protocol, although it seems that their purpose may not be the same. Other registers appear to be specific to the LWLA1016.&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;
!Address&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
| 1000&lt;br /&gt;
| SAMPLE_MASK&lt;br /&gt;
| Bit mask of enabled channels.&lt;br /&gt;
|-&lt;br /&gt;
| 1010&lt;br /&gt;
| MS&lt;br /&gt;
| Elapsed time in milliseconds.&lt;br /&gt;
|-&lt;br /&gt;
| 1070&lt;br /&gt;
| ASRAM_WR_PTR&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 1074&lt;br /&gt;
| ASRAM_RD_PTR&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 1078&lt;br /&gt;
| ASRAM_DATA&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 107C&lt;br /&gt;
| ASRAM_CTR&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 10B0&lt;br /&gt;
| ST_CNTR&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 10B4&lt;br /&gt;
| ST_TOTAL_CNTR1&amp;lt;br/&amp;gt;ST_TRG_SEL&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 10B8&lt;br /&gt;
| ST_CTL&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 10BC&lt;br /&gt;
| ST_TOTAL_CNTR0&amp;lt;br/&amp;gt;ST_DIV_CNTR&amp;lt;br/&amp;gt;ST_PORT_VAL&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Task Recipes ==&lt;br /&gt;
&lt;br /&gt;
This section lists the commands issued by the software to perform a particular task.&lt;br /&gt;
&lt;br /&gt;
=== Initialization ===&lt;br /&gt;
&lt;br /&gt;
# Acquire control of USB device and select configuration 1&lt;br /&gt;
# Send FPGA bitstream to EP 4 via bulk transfer&lt;br /&gt;
# Initial register activity:&lt;br /&gt;
## Read register 0x10B4, expected reply is 0x12345678&lt;br /&gt;
## Read register 0x10B4 (again), expected reply is 0x12345678&lt;br /&gt;
## Send command 5, which seems to have the same format and payload as with the LWLA1034&lt;br /&gt;
&lt;br /&gt;
=== Device State Polling ===&lt;br /&gt;
&lt;br /&gt;
# Read register 0x10B8, reply is 0x10 in timing-state mode, or 0 in normal mode&lt;br /&gt;
# Read register 0x10B0, reply is 0&lt;br /&gt;
# Read register 0x1070, reply is 0&lt;br /&gt;
# Read register 0x10BC, reply is 0x1234xxxx, where &amp;quot;xxxx&amp;quot; is the channel state&lt;br /&gt;
# Read register 0x1010, reply is 0&lt;/div&gt;</summary>
		<author><name>Danielk</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=Sysclk_LWLA1034/Protocol&amp;diff=11177</id>
		<title>Sysclk LWLA1034/Protocol</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=Sysclk_LWLA1034/Protocol&amp;diff=11177"/>
		<updated>2015-10-25T11:58:47Z</updated>

		<summary type="html">&lt;p&gt;Danielk: Long write: Correct interchangeable step numbers&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== FPGA Configuration ==&lt;br /&gt;
&lt;br /&gt;
The FPGA bitstream is loaded via bulk transfer to USB end point 4. Each firmware transfer starts with a 4-byte header to announce the transfer size. The payload appears to be a Raw Binary File (.rbf) with compression enabled.&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;
!Length&lt;br /&gt;
!Payload...&lt;br /&gt;
|-&lt;br /&gt;
| nnnn-nnnn&lt;br /&gt;
| dd...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Unlike the control commands, the firmware transfer is apparently byte-based. The length is a byte count encoded in big endian (1-2-3-4) byte order, and includes the size of the length field (4 bytes) itself.&lt;br /&gt;
&lt;br /&gt;
=== Application Behavior ===&lt;br /&gt;
&lt;br /&gt;
The vendor software transfers a new bitstream to the FPGA&lt;br /&gt;
# on application start,&lt;br /&gt;
# when switching clocking mode between internal, external/rising or external/falling,&lt;br /&gt;
# on application exit.&lt;br /&gt;
&lt;br /&gt;
The size of the bitstream varies due to compression, but is in the order of 50kB to 80kB. The firmware transfer is split by the vendor software into packets with 15 byte payload each and thus takes quite a bit of time inside VirtualBox. Testing with a libusb-based tool for issuing USB bulk transfers has shown that this does not appear to be necessary: Transferring even the entire firmware blob in a single bulk transfer appears to work without error.&lt;br /&gt;
=== Firmware Extraction ===&lt;br /&gt;
&lt;br /&gt;
The firmware blobs can be extracted directly from the Windows installer executable located on the CD-ROM that ships with the device.  The file &amp;lt;tt&amp;gt;lwla1034_EN_setup.exe&amp;lt;/tt&amp;gt; on the CD-ROM from 2012-07-12 has the firmware blobs located at the following offsets:&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;
!Offset&lt;br /&gt;
!Length&lt;br /&gt;
!Mode&lt;br /&gt;
|-&lt;br /&gt;
| 34110338&lt;br /&gt;
| 78398&lt;br /&gt;
| Internal clock&lt;br /&gt;
|-&lt;br /&gt;
| 34266237&lt;br /&gt;
| 78247&lt;br /&gt;
| External clock (rising edge)&lt;br /&gt;
|-&lt;br /&gt;
| 34344484&lt;br /&gt;
| 79145&lt;br /&gt;
| External clock (falling edge)&lt;br /&gt;
|-&lt;br /&gt;
| 34578631&lt;br /&gt;
| 48525&lt;br /&gt;
| Shutdown&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Both offsets and lengths are in bytes. The extracted blobs already include the header with the 32-bit length field.&lt;br /&gt;
&lt;br /&gt;
== Control Commands ==&lt;br /&gt;
&lt;br /&gt;
Control commands are sent via bulk transfer to USB end point 2, with the response (if any) coming in from end point 6.&lt;br /&gt;
&lt;br /&gt;
Command messages are sent to the device as a sequence of 16-bit words with little endian byte order. The first word in a message identifies the command type. Different command types have different message lengths. Some command types include a length field and allow for messages of variable length, others are of fixed size.&lt;br /&gt;
&lt;br /&gt;
There are read commands which trigger an immediate response from the device, and write commands without a response.&lt;br /&gt;
&lt;br /&gt;
=== Command 0001: Read Register ===&lt;br /&gt;
&lt;br /&gt;
This command reads a 32-bit wide control register.&lt;br /&gt;
&lt;br /&gt;
==== Command ====&lt;br /&gt;
&lt;br /&gt;
Fixed length of 2 words (4 bytes).&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;
!ID&lt;br /&gt;
!Address&lt;br /&gt;
|-&lt;br /&gt;
| 0001&lt;br /&gt;
| aaaa&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Response ====&lt;br /&gt;
&lt;br /&gt;
The response has a fixed length of 2 words (4 bytes). It is the content of a 32-bit register in mixed endian (2-1-4-3) byte order.&lt;br /&gt;
&lt;br /&gt;
==== Registers ====&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;
!Address&lt;br /&gt;
!Value&lt;br /&gt;
|-&lt;br /&gt;
| 10C0&lt;br /&gt;
| Channel 1 frequency counter&lt;br /&gt;
|-&lt;br /&gt;
| 10C4&lt;br /&gt;
| Channel 2 frequency counter&lt;br /&gt;
|-&lt;br /&gt;
| 10C8&lt;br /&gt;
| Channel 3 frequency counter&lt;br /&gt;
|-&lt;br /&gt;
| 10CC&lt;br /&gt;
| Channel 4 frequency counter&lt;br /&gt;
|}&lt;br /&gt;
These registers apparently count the number of rising (or falling?) clock edges on channels 1 to 4. The vendor software polls these counters every second to display a live frequency count for the first four channels.&lt;br /&gt;
&lt;br /&gt;
It is unclear what time base is being used for those counters: The large error (sometimes by more than 20%, especially for CH1) hints at I/O latency, which would imply that the software resets the counters. However, manual testing of single register reads has shown that the values do not seem to scale with the time between reads. This would mean the device is using an internal time base after all. However, that makes the large error a bit hard to explain, especially since the error is different for each channel despite being driven by the same signal source.&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;
!Address&lt;br /&gt;
!Selftest value&lt;br /&gt;
|-&lt;br /&gt;
| 10B0&lt;br /&gt;
| 12345678&lt;br /&gt;
|-&lt;br /&gt;
| 10BC&lt;br /&gt;
| 12345678&lt;br /&gt;
|-&lt;br /&gt;
| 10B8&lt;br /&gt;
| 87654321&lt;br /&gt;
|}&lt;br /&gt;
These three registers assume the values listed here after writing 100 (decimal) to register 10B4. This is apparently an identification and self-test sequence, which is performed twice in a row during initialization. After initialization, these registers are part of command sequences which initiate device operations, like capture start/stop.&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;
!Address&lt;br /&gt;
!Value&lt;br /&gt;
|-&lt;br /&gt;
| 1078&lt;br /&gt;
| Capture size (number of 36-bit words)&lt;br /&gt;
|}&lt;br /&gt;
This register holds the (compressed) size of the captured data. The vendor software retrieves this just before fetching the SRAM content.&lt;br /&gt;
&lt;br /&gt;
=== Command 0002: Write Register ===&lt;br /&gt;
&lt;br /&gt;
This command writes a 32-bit value to a control register.&lt;br /&gt;
&lt;br /&gt;
==== Command ====&lt;br /&gt;
&lt;br /&gt;
Fixed length of 4 words (8 bytes).&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;
!ID&lt;br /&gt;
!Address&lt;br /&gt;
!Data&lt;br /&gt;
|-&lt;br /&gt;
| 0002&lt;br /&gt;
| aaaa&lt;br /&gt;
| dddd-dddd&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The value is encoded in mixed endian (2-1-4-3) byte order.&lt;br /&gt;
&lt;br /&gt;
==== Registers ====&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;
!Address&lt;br /&gt;
!Init value&lt;br /&gt;
|-&lt;br /&gt;
| 10B4&lt;br /&gt;
| 00000064&lt;br /&gt;
|}&lt;br /&gt;
The vendor software writes the value 100 (decimal) to this register during initialization into order to start the self test sequence. After that, the magic register values listed in the table for command 0001 become available. So, this is kind of a command-triggering register, and there are other command codes, too.&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;
!Address&lt;br /&gt;
!Purpose&lt;br /&gt;
|-&lt;br /&gt;
| 1094&lt;br /&gt;
| Bypass clock divider&lt;br /&gt;
|-&lt;br /&gt;
| 10B4&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 10B8&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 10BC&lt;br /&gt;
| ???&lt;br /&gt;
|}&lt;br /&gt;
These are written to when a capture operation is initiated or cancelled. Register 1094 is set to 0 when using the internal clock with sampling rates of 100 MHz and below. For 125 MHz internal clock or the external clock modes, it is set to 1.&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;
!Address&lt;br /&gt;
!Init value&lt;br /&gt;
|-&lt;br /&gt;
| 1074&lt;br /&gt;
| 00000002&lt;br /&gt;
|-&lt;br /&gt;
| 107C&lt;br /&gt;
| 00000000&lt;br /&gt;
|}&lt;br /&gt;
The vendor software writes these two registers during initialization, and also when initiating a capture.&lt;br /&gt;
&lt;br /&gt;
=== Command 0005: Write ??? ===&lt;br /&gt;
&lt;br /&gt;
This command appears to write 16 32-bit words at once. The vendor software issues this after a transfer of captured data to the host has finished, but only for the first three captures. After that, the application needs to be restarted to ever see this command again.&lt;br /&gt;
&lt;br /&gt;
The data written varies each time, but it appears that only the lowest 8 bit of each 32-bit word are ever written. No idea what this might do. It could be calibration feedback or something, although it is hard to imagine how the host could help the device with that. Luckily, the sigrok driver works without ever sending this command at all.&lt;br /&gt;
&lt;br /&gt;
==== Command ====&lt;br /&gt;
&lt;br /&gt;
Fixed length of 33 words (66 bytes).&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;
!ID&lt;br /&gt;
!Data 1&lt;br /&gt;
!Data 2&lt;br /&gt;
!...&lt;br /&gt;
!Data 16&lt;br /&gt;
|-&lt;br /&gt;
| 0005&lt;br /&gt;
| dddd-dddd&lt;br /&gt;
| dddd-dddd&lt;br /&gt;
| ...&lt;br /&gt;
| dddd-dddd&lt;br /&gt;
|}&lt;br /&gt;
The byte order of each 32-bit word is most likely the usual 2-1-4-3 mixed endianess.&lt;br /&gt;
&lt;br /&gt;
==== Sample capture ====&lt;br /&gt;
&lt;br /&gt;
A sample of three such commands from an actual protocol analysis session:&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
 10185	56.455640		Cmd 5: write ??? data C3 9A 4B 91 30 D2 98 C1 CA F2 D7 4F 82 74 C0 8B&lt;br /&gt;
 14155	95.788766		Cmd 5: write ??? data E5 7B 2C F3 6B 06 76 4B 60 94 F3 EC C9 AA E9 35&lt;br /&gt;
 17823	131.101569		Cmd 5: write ??? data 16 66 EA 7B 35 F6 71 A8 0A E0 D7 E7 45 E0 4F 23&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
Only the least significant byte is shown for each 32-bit data word, as the other bytes are always 0. The message content changes with each run of the vendor software. It&amp;#039;s hard to make head or tail of this. However, as this command is issued after all captured data has been retrieved, it cannot possibly affect the preceding capture and read-out operations.&lt;br /&gt;
&lt;br /&gt;
=== Command 0006: Read Memory at Address ===&lt;br /&gt;
&lt;br /&gt;
This command reads a chunk of data from the device memory (SRAM). It allows for random access using a 32-bit start address, and for variable length via a 32-bit length field. The software uses this command to read captured data from the device&amp;#039;s buffer.&lt;br /&gt;
&lt;br /&gt;
==== Command ====&lt;br /&gt;
&lt;br /&gt;
Fixed length of 5 words (10 bytes).&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;
!ID&lt;br /&gt;
!Address&lt;br /&gt;
!Length&lt;br /&gt;
|-&lt;br /&gt;
| 0006&lt;br /&gt;
| aaaa-aaaa&lt;br /&gt;
| nnnn-nnnn&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Both the address and the length are encoded in mixed endian (2-1-4-3) byte order.&lt;br /&gt;
&lt;br /&gt;
==== Response ====&lt;br /&gt;
&lt;br /&gt;
The memory is 36 bit wide, and thus the size of the response in bits is 36 times the value in the length field. The original vendor software reads chunks of 120 words @ 36 bit at a time, which works out to an integer multiple of 32 (i.e. 4320 bits = 135 32-bit words or 540 bytes). The final six reads are done in chunks of 8 words @ 36 bit, which works out to nine 32-bit words or 36 bytes. The overall amount of memory being read when fetching captured samples from a full buffer is just below the RAM size of 256k×36 bit.&lt;br /&gt;
&lt;br /&gt;
Note that the software always starts reading at address 4 rather than 0. Presumably, the firmware uses the first four 36-bit words for internal bookkeeping or some other purpose. Exception to the rule: For some unknown reason (perhaps testing), the memory is also being read on start-up right after loading the firmware into the FPGA. In this case, altogether 128000 36-bit words are being read beginning at address 0.&lt;br /&gt;
&lt;br /&gt;
Note that reading more than 1024 bytes at a time seems to be unreliable. Due to the constraints outlined in the following section, the maximum read length should therefore be restricted to 224 device words, which works out to 1008 bytes.&lt;br /&gt;
&lt;br /&gt;
===== 36-to-32 Bit Mapping =====&lt;br /&gt;
&lt;br /&gt;
The data returned by the read command consists of 32-bit words in 2-1-4-3 mixed endian byte order. Eight consecutive 36-bit words from the SRAM are mapped at a time to nine consecutive 32-bit words in the received stream. The first of these slices aligns to the beginning of the read-out stream, apparently irrespective of the absolute start address of the read operation.&lt;br /&gt;
&lt;br /&gt;
The first eight 32-bit words in a slice contain the lower 32 bit of the eight encoded 36-bit words. The ninth 32-bit word contains the four remaining high bits of all eight 36-bit words combined. The high nibbles are shifted into the ninth word from right to left, resulting in a 1-2-3-4-5-6-7-8 order of nibbles. (This is after conversion from mixed endian byte order!)&lt;br /&gt;
&lt;br /&gt;
As it is necessary to access the ninth 32-bit word in each slice even to fully extract the first 36-bit word, it follows that memory reads should always request a multiple of the slice length, i.e. eight 36-bit words. The length of the response will thus always be a multiple of nine 32-bit words (36 bytes). However, it does not appear to be necessary to restrict read operations to only the two lengths 120 and 8 used by the vendor software.&lt;br /&gt;
&lt;br /&gt;
===== Compression Scheme =====&lt;br /&gt;
&lt;br /&gt;
The compression scheme is a form of run-length encoding. Very short run lengths of only one or two cycles are handled as special cases, which helps to keep the worst-case overhead of compression pretty low. In particular, the scheme ensures that it is never necessary to write more than one 36-bit word per sampling cycle to the SRAM buffer.&lt;br /&gt;
&lt;br /&gt;
Each 36-bit word in the stream is either a data word or a repeat half-count word. The first word in the stream is a data word, with the following layout:&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;
!Bit&lt;br /&gt;
!35&lt;br /&gt;
!34&lt;br /&gt;
!33&lt;br /&gt;
!32&lt;br /&gt;
!31&lt;br /&gt;
!...&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
!Meaning&lt;br /&gt;
| Repeat count follows&lt;br /&gt;
| LSB of repeat count&lt;br /&gt;
| CH34&lt;br /&gt;
| CH33&lt;br /&gt;
| CH32&lt;br /&gt;
| ...&lt;br /&gt;
| CH3&lt;br /&gt;
| CH2&lt;br /&gt;
| CH1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
If bit 35 is set, then the next 36-bit word in the stream encodes the number of cycles the previous data word is repeated, divided by two. The actual number of repeat cycles is twice that number plus the LSB of repeat count, i.e. bit 34 from the data word. If bit 35 is not set the next word is again a data word and the repeat half-count is assumed as zero. However, the LSB of repeat count bit still applies; i.e. if it is set then the repeat count would be 1.&lt;br /&gt;
&lt;br /&gt;
So, to recap, repeat counts 0 to 1 are encoded as part of the channel data word, larger repeat counts use up a full extra 36-bit word. The combined repeat count is then 37 bit wide. At 125 MHz, this scheme would allow for encoding run lengths of more than 18 minutes. However, note that the vendor software does not actually make use of the full range: Apparently, it stops as soon as the count rolls over into bit 36, thereby cutting the maximum possible run length in half (i.e. about 9 minutes at 125 MHz). However, this detail does not make any difference for the decompression algorithm.&lt;br /&gt;
&lt;br /&gt;
The next word following a repeat half-count is again a data word. Note that it is possible for a sample/run-length pair to be split across a slice boundary, or even across successive read chunks. The decoder therefore needs to keep track of RLE state across slices as well as read operations.&lt;br /&gt;
&lt;br /&gt;
=== Command 0007: Capture Setup ===&lt;br /&gt;
&lt;br /&gt;
This command prepares a capture operation. Essentially, this command appears to write to an internal memory block with 64-bit granularity. Command 0008 can be used to read from the same memory.&lt;br /&gt;
&lt;br /&gt;
The vendor software issues this command once during start-up, and once for each capture operation as part of the setup sequence. It is also issued when clicking the Stop button to cancel a capture in progress.&lt;br /&gt;
&lt;br /&gt;
==== Command ====&lt;br /&gt;
&lt;br /&gt;
Variable length of 3 words (6 bytes) plus length × 4 words (8 bytes).&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;
!ID&lt;br /&gt;
!Address&lt;br /&gt;
!Length&lt;br /&gt;
!Data&lt;br /&gt;
!...&lt;br /&gt;
|-&lt;br /&gt;
| 0007&lt;br /&gt;
| aaaa&lt;br /&gt;
| nnnn&lt;br /&gt;
| dddd-dddd-dddd-dddd&lt;br /&gt;
| ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The two argument words are the start address and the length of the slice to write, in little endian byte order. Both the address and the length refer to quantities of 64 bit (4 words or 8 bytes). Thus, if length is 10 the payload should consist of 40 words or 80 bytes.&lt;br /&gt;
&lt;br /&gt;
The vendor software always writes a slice of length 10 beginning at address 0, thus completely resetting both the capture configuration as well as the capture status. The layout of the configuration and status memory is outlined in the description of command 0008.&lt;br /&gt;
&lt;br /&gt;
=== Command 0008: Capture Status ===&lt;br /&gt;
&lt;br /&gt;
This command reads the current capture configuration and status. Essentially, this command appears to read a slice from an internal memory block with 64-bit granularity -- the same memory space command 7 writes to. During idle periods, the software polls the channel state about 34 times per second for its live port status display. During a capture operation, it is necessary to poll the status in order to find out whether the capture buffer has been filled completely and samples can be retrieved.&lt;br /&gt;
&lt;br /&gt;
==== Command ====&lt;br /&gt;
&lt;br /&gt;
Fixed length of 3 words (6 bytes).&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;
!ID&lt;br /&gt;
!Address&lt;br /&gt;
!Length&lt;br /&gt;
|-&lt;br /&gt;
| 0008&lt;br /&gt;
| aaaa&lt;br /&gt;
| nnnn&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The two argument words are the start address and the length of the slice to read, in little endian byte order. Both the address and the length refer to quantities of 64 bit (4 words or 8 bytes). Thus, if length is 10 the reply will consist of 40 words or 80 bytes.&lt;br /&gt;
&lt;br /&gt;
Although the vendor software always reads the full 10 fields of configuration and status information, it does not seem to be an actual requirement. Restricting reads to fields 5 to 9 in the sigrok driver works fine so far without any problems.&lt;br /&gt;
&lt;br /&gt;
==== Response ====&lt;br /&gt;
&lt;br /&gt;
The table below shows the response to the command as issued by the vendor software, i.e. with start address 0 and length 10. Each row is a 64-bit word in very much mixed up (6-5-8-7-2-1-4-3) byte order. Roughly, the first half is used to set up a capture operation, whereas the second half contains status information. Field 5 is an exception, as it is used for both setup and status.&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;
!Index&lt;br /&gt;
!Byte offset&lt;br /&gt;
!Value&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 00&lt;br /&gt;
| Channel enable mask&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 08&lt;br /&gt;
| Clock divider count&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 10&lt;br /&gt;
| Trigger level mask&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| 18&lt;br /&gt;
| Trigger edge mask&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 20&lt;br /&gt;
| Trigger enable mask&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| 28&lt;br /&gt;
| Capture memory fill level&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| 30&lt;br /&gt;
| Not used?&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| 38&lt;br /&gt;
| Running capture duration&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 40&lt;br /&gt;
| Channel input state&lt;br /&gt;
|-&lt;br /&gt;
| 9&lt;br /&gt;
| 48&lt;br /&gt;
| Capture status flags&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The channel enable mask and the input state are bit vectors, with bit 0 of the 64-bit word (after unmixing the byte order!) corresponding to CH1 and bit 33 corresponding to CH34. The enable mask shows which channels have been enabled for capturing. The bits in the input state vector signify whether the voltage at the corresponding input channels is currently low (0) or high (1).&lt;br /&gt;
&lt;br /&gt;
Field 1 sets the max value of the counter which divides the internal clock to yield the sampling clock. This applies to all sample rates of 100MHz or less (125MHz is a special case: see control register 1094). The counter max value is calculated as follows: maxcount = 1 / (samplefreq * 10ns) - 1&lt;br /&gt;
&lt;br /&gt;
Field 4 is the trigger enable mask. 1 enables triggering on a channel, 0 disables it. CH1 is mapped to bit 0 and CH34 to bit 33. Bits 34 and 35 are special and configure for external triggering. Bit 34 enables external triggering on the falling edge, bit 35 on the rising edge.&lt;br /&gt;
&lt;br /&gt;
If a trigger channel is enabled, the corresponding bit in field 3 configures whether to trigger on level (0) or edge (1). The corresponding bit in field 2 then selects whether to trigger on low/falling (0) or high/rising (1).&lt;br /&gt;
&lt;br /&gt;
During setup, field 5 is used to limit the (compressed) size of the captured data. During a running capture operation, field 5 indicates the current memory fill level.&lt;br /&gt;
&lt;br /&gt;
Field 7 is the time passed since the first sample. For samplerates up to 100 MHz, the value is a duration in milliseconds. The 125 MHz setting is again special and uses the same timebase as the 100 MHz setting, i.e. field 7 can then be interpreted as the sample count × 10&amp;lt;sup&amp;gt;−5&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Field 8 records a snapshot of the signal level of all 34 channels at the time the status is being read.&lt;br /&gt;
&lt;br /&gt;
Field 6 appears to be unused.&lt;br /&gt;
&lt;br /&gt;
===== Capture Status Flags =====&lt;br /&gt;
&lt;br /&gt;
The status flag bits are used as follows:&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;
!Bit 0&lt;br /&gt;
!Bit 1&lt;br /&gt;
!Bit 2&lt;br /&gt;
!Bit 3&lt;br /&gt;
!Bit 4&lt;br /&gt;
!Bit 5&lt;br /&gt;
|-&lt;br /&gt;
| ???&lt;br /&gt;
| Capturing&lt;br /&gt;
| ???&lt;br /&gt;
| ???&lt;br /&gt;
| Triggered&lt;br /&gt;
| Memory available&lt;br /&gt;
|}&lt;br /&gt;
The higher bits of field 9 appear to contain garbage (apparently copies of the bits from field 8).&lt;br /&gt;
&lt;br /&gt;
== Task Recipes ==&lt;br /&gt;
&lt;br /&gt;
This section lists the commands issued by the software to perform a particular task.&lt;br /&gt;
&lt;br /&gt;
=== Long Register Read ===&lt;br /&gt;
&lt;br /&gt;
This sequence reads from a 64-bit wide internal memory, probably the same as that accessed by commands 7 and 8.&lt;br /&gt;
&lt;br /&gt;
# Write index to address register 0x10B4&lt;br /&gt;
# Read dummy value from strobe register 0x10B0&lt;br /&gt;
# Read high word from register 0x10BC&lt;br /&gt;
# Read low word from register 0x10B8&lt;br /&gt;
&lt;br /&gt;
Steps 3 and 4 appear to be interchangeable.&lt;br /&gt;
&lt;br /&gt;
=== Long Register Write ===&lt;br /&gt;
&lt;br /&gt;
This sequence writes to a 64-bit wide internal memory, probably the same as that accessed by commands 7 and 8.&lt;br /&gt;
&lt;br /&gt;
# Write index to address register 0x10B4&lt;br /&gt;
# Write low word to register 0x10B8&lt;br /&gt;
# Write high word to register 0x10BC&lt;br /&gt;
# Write 0 (dummy value) to strobe register 0x10B0&lt;br /&gt;
&lt;br /&gt;
Steps 2 and 3 appear to be interchangeable.&lt;br /&gt;
&lt;br /&gt;
=== Initialization ===&lt;br /&gt;
&lt;br /&gt;
# Acquire control of USB device and select configuration 1&lt;br /&gt;
# Send FPGA bitstream (default: internal clock) to EP 4 via bulk transfer&lt;br /&gt;
# Device test sequence:&lt;br /&gt;
## Read long register 100; ignore result&lt;br /&gt;
## Read long register 100; result should be 0x1234567887654321&lt;br /&gt;
# Capture setup/state test (vendor software does this, not mandatory):&lt;br /&gt;
## Write sequence 0..9 to capture setup fields (via command 7)&lt;br /&gt;
## Read back capture state (via command 8): 0..4 should be read back as is, 5..9 are trashed anyway&lt;br /&gt;
# Memory test (vendor software does this, not mandatory):&lt;br /&gt;
## Write 2 to register 0x1074&lt;br /&gt;
## Write 0 to register 0x107C&lt;br /&gt;
## Read memory beginning at address 0 in chunks of 120 36-bit words, up to but not including 0x013FB0&lt;br /&gt;
## Read memory beginning at address 0x013FB0 in chunks of 8 36-bit words, up to but not including 0x014000&lt;br /&gt;
&lt;br /&gt;
It does not seem to be necessary to use exactly the same read chunk length as the original vendor software. See the description of command 6 for constraints.&lt;br /&gt;
&lt;br /&gt;
=== Poll channel state ===&lt;br /&gt;
&lt;br /&gt;
The vendor software continuously polls the channel state even when idle. However, it is not mandatory to do so.&lt;br /&gt;
&lt;br /&gt;
# Poll frequency of signal at CH1 to CH4:&lt;br /&gt;
## Read register 0x10C0: value is frequency of CH1 signal&lt;br /&gt;
## Read register 0x10C4: value is frequency of CH2 signal&lt;br /&gt;
## Read register 0x10C8: value is frequency of CH3 signal&lt;br /&gt;
## Read register 0x10CC: value is frequency of CH4 signal&lt;br /&gt;
# Poll signal level of all channels:&lt;br /&gt;
## Read capture state (via command 8): the signal level of all channels is recorded in field 8&lt;br /&gt;
&lt;br /&gt;
=== Clocking Mode Switch ===&lt;br /&gt;
&lt;br /&gt;
# Transfer one of three FPGA bitstreams to EP 4:&lt;br /&gt;
## Configuration for internal clock&lt;br /&gt;
## Configuration for external clock, rising edge&lt;br /&gt;
## Configuration for external clock, falling edge&lt;br /&gt;
&lt;br /&gt;
=== Signal Capture ===&lt;br /&gt;
&lt;br /&gt;
# Write 2 to register 0x1074&lt;br /&gt;
# Write 1 to register 0x1074&lt;br /&gt;
# Write 0x74 to long register 10&lt;br /&gt;
# Write divider bypass flag to register 0x1094 (see description of register)&lt;br /&gt;
# Write capture setup (command 7, address 0, length 10: see description of command)&lt;br /&gt;
# Write 1 to long register 10&lt;br /&gt;
# Wait for capture to finish:&lt;br /&gt;
## Poll capture state (command 8, address 0, length 10: see description of command)&lt;br /&gt;
## Report progress information (got trigger, cycles elapsed, memory fill percentage) to user&lt;br /&gt;
## Capture has finished once the memory available flag is reset&lt;br /&gt;
&lt;br /&gt;
=== Cancel Signal Capture ===&lt;br /&gt;
&lt;br /&gt;
# Write 0 to long register 10&lt;br /&gt;
# Write 0 to register 0x1094 (divider bypass flag)&lt;br /&gt;
&lt;br /&gt;
After that, the memory available flag in the capture state should have been cleared. Continue in the same manner as for a regularly finished capture.&lt;br /&gt;
&lt;br /&gt;
=== Read Captured Data ===&lt;br /&gt;
&lt;br /&gt;
# Read register 0x1078: value is the number of 36-bit words in the capture buffer&lt;br /&gt;
# Write 1 to register 0x1094 (divider bypass flag)&lt;br /&gt;
# Write 2 to register 0x1074&lt;br /&gt;
# Write 4 to register 0x107C&lt;br /&gt;
# Read capture buffer:&lt;br /&gt;
## Read memory beginning at address 4 in chunks of 120 36-bit words, up to but not including 0x03FFC4&lt;br /&gt;
## Read memory beginning at address 0x03FFC4 in chunks of 8 36-bit words, up to but not including 0x03FFF4&lt;br /&gt;
# Write 0 to register 0x1094 (divider bypass flag)&lt;br /&gt;
# Issue mystery command 5 with mystery data, but for some mystical reason only for the first three captures after application start&lt;br /&gt;
&lt;br /&gt;
It does not seem to be necessary to use exactly the same read chunk length as the original vendor software. See the description of command 6 for constraints.&lt;br /&gt;
&lt;br /&gt;
The sigrok driver works fine without ever issuing mystery command 5.&lt;br /&gt;
&lt;br /&gt;
=== Shutdown ===&lt;br /&gt;
&lt;br /&gt;
1. Transfer FPGA configuration for device shutdown to EP 4&lt;/div&gt;</summary>
		<author><name>Danielk</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=Sysclk_LWLA1034/Protocol&amp;diff=11176</id>
		<title>Sysclk LWLA1034/Protocol</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=Sysclk_LWLA1034/Protocol&amp;diff=11176"/>
		<updated>2015-10-25T11:42:59Z</updated>

		<summary type="html">&lt;p&gt;Danielk: Reference long read/write in task recipes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== FPGA Configuration ==&lt;br /&gt;
&lt;br /&gt;
The FPGA bitstream is loaded via bulk transfer to USB end point 4. Each firmware transfer starts with a 4-byte header to announce the transfer size. The payload appears to be a Raw Binary File (.rbf) with compression enabled.&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;
!Length&lt;br /&gt;
!Payload...&lt;br /&gt;
|-&lt;br /&gt;
| nnnn-nnnn&lt;br /&gt;
| dd...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Unlike the control commands, the firmware transfer is apparently byte-based. The length is a byte count encoded in big endian (1-2-3-4) byte order, and includes the size of the length field (4 bytes) itself.&lt;br /&gt;
&lt;br /&gt;
=== Application Behavior ===&lt;br /&gt;
&lt;br /&gt;
The vendor software transfers a new bitstream to the FPGA&lt;br /&gt;
# on application start,&lt;br /&gt;
# when switching clocking mode between internal, external/rising or external/falling,&lt;br /&gt;
# on application exit.&lt;br /&gt;
&lt;br /&gt;
The size of the bitstream varies due to compression, but is in the order of 50kB to 80kB. The firmware transfer is split by the vendor software into packets with 15 byte payload each and thus takes quite a bit of time inside VirtualBox. Testing with a libusb-based tool for issuing USB bulk transfers has shown that this does not appear to be necessary: Transferring even the entire firmware blob in a single bulk transfer appears to work without error.&lt;br /&gt;
=== Firmware Extraction ===&lt;br /&gt;
&lt;br /&gt;
The firmware blobs can be extracted directly from the Windows installer executable located on the CD-ROM that ships with the device.  The file &amp;lt;tt&amp;gt;lwla1034_EN_setup.exe&amp;lt;/tt&amp;gt; on the CD-ROM from 2012-07-12 has the firmware blobs located at the following offsets:&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;
!Offset&lt;br /&gt;
!Length&lt;br /&gt;
!Mode&lt;br /&gt;
|-&lt;br /&gt;
| 34110338&lt;br /&gt;
| 78398&lt;br /&gt;
| Internal clock&lt;br /&gt;
|-&lt;br /&gt;
| 34266237&lt;br /&gt;
| 78247&lt;br /&gt;
| External clock (rising edge)&lt;br /&gt;
|-&lt;br /&gt;
| 34344484&lt;br /&gt;
| 79145&lt;br /&gt;
| External clock (falling edge)&lt;br /&gt;
|-&lt;br /&gt;
| 34578631&lt;br /&gt;
| 48525&lt;br /&gt;
| Shutdown&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Both offsets and lengths are in bytes. The extracted blobs already include the header with the 32-bit length field.&lt;br /&gt;
&lt;br /&gt;
== Control Commands ==&lt;br /&gt;
&lt;br /&gt;
Control commands are sent via bulk transfer to USB end point 2, with the response (if any) coming in from end point 6.&lt;br /&gt;
&lt;br /&gt;
Command messages are sent to the device as a sequence of 16-bit words with little endian byte order. The first word in a message identifies the command type. Different command types have different message lengths. Some command types include a length field and allow for messages of variable length, others are of fixed size.&lt;br /&gt;
&lt;br /&gt;
There are read commands which trigger an immediate response from the device, and write commands without a response.&lt;br /&gt;
&lt;br /&gt;
=== Command 0001: Read Register ===&lt;br /&gt;
&lt;br /&gt;
This command reads a 32-bit wide control register.&lt;br /&gt;
&lt;br /&gt;
==== Command ====&lt;br /&gt;
&lt;br /&gt;
Fixed length of 2 words (4 bytes).&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;
!ID&lt;br /&gt;
!Address&lt;br /&gt;
|-&lt;br /&gt;
| 0001&lt;br /&gt;
| aaaa&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Response ====&lt;br /&gt;
&lt;br /&gt;
The response has a fixed length of 2 words (4 bytes). It is the content of a 32-bit register in mixed endian (2-1-4-3) byte order.&lt;br /&gt;
&lt;br /&gt;
==== Registers ====&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;
!Address&lt;br /&gt;
!Value&lt;br /&gt;
|-&lt;br /&gt;
| 10C0&lt;br /&gt;
| Channel 1 frequency counter&lt;br /&gt;
|-&lt;br /&gt;
| 10C4&lt;br /&gt;
| Channel 2 frequency counter&lt;br /&gt;
|-&lt;br /&gt;
| 10C8&lt;br /&gt;
| Channel 3 frequency counter&lt;br /&gt;
|-&lt;br /&gt;
| 10CC&lt;br /&gt;
| Channel 4 frequency counter&lt;br /&gt;
|}&lt;br /&gt;
These registers apparently count the number of rising (or falling?) clock edges on channels 1 to 4. The vendor software polls these counters every second to display a live frequency count for the first four channels.&lt;br /&gt;
&lt;br /&gt;
It is unclear what time base is being used for those counters: The large error (sometimes by more than 20%, especially for CH1) hints at I/O latency, which would imply that the software resets the counters. However, manual testing of single register reads has shown that the values do not seem to scale with the time between reads. This would mean the device is using an internal time base after all. However, that makes the large error a bit hard to explain, especially since the error is different for each channel despite being driven by the same signal source.&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;
!Address&lt;br /&gt;
!Selftest value&lt;br /&gt;
|-&lt;br /&gt;
| 10B0&lt;br /&gt;
| 12345678&lt;br /&gt;
|-&lt;br /&gt;
| 10BC&lt;br /&gt;
| 12345678&lt;br /&gt;
|-&lt;br /&gt;
| 10B8&lt;br /&gt;
| 87654321&lt;br /&gt;
|}&lt;br /&gt;
These three registers assume the values listed here after writing 100 (decimal) to register 10B4. This is apparently an identification and self-test sequence, which is performed twice in a row during initialization. After initialization, these registers are part of command sequences which initiate device operations, like capture start/stop.&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;
!Address&lt;br /&gt;
!Value&lt;br /&gt;
|-&lt;br /&gt;
| 1078&lt;br /&gt;
| Capture size (number of 36-bit words)&lt;br /&gt;
|}&lt;br /&gt;
This register holds the (compressed) size of the captured data. The vendor software retrieves this just before fetching the SRAM content.&lt;br /&gt;
&lt;br /&gt;
=== Command 0002: Write Register ===&lt;br /&gt;
&lt;br /&gt;
This command writes a 32-bit value to a control register.&lt;br /&gt;
&lt;br /&gt;
==== Command ====&lt;br /&gt;
&lt;br /&gt;
Fixed length of 4 words (8 bytes).&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;
!ID&lt;br /&gt;
!Address&lt;br /&gt;
!Data&lt;br /&gt;
|-&lt;br /&gt;
| 0002&lt;br /&gt;
| aaaa&lt;br /&gt;
| dddd-dddd&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The value is encoded in mixed endian (2-1-4-3) byte order.&lt;br /&gt;
&lt;br /&gt;
==== Registers ====&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;
!Address&lt;br /&gt;
!Init value&lt;br /&gt;
|-&lt;br /&gt;
| 10B4&lt;br /&gt;
| 00000064&lt;br /&gt;
|}&lt;br /&gt;
The vendor software writes the value 100 (decimal) to this register during initialization into order to start the self test sequence. After that, the magic register values listed in the table for command 0001 become available. So, this is kind of a command-triggering register, and there are other command codes, too.&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;
!Address&lt;br /&gt;
!Purpose&lt;br /&gt;
|-&lt;br /&gt;
| 1094&lt;br /&gt;
| Bypass clock divider&lt;br /&gt;
|-&lt;br /&gt;
| 10B4&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 10B8&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 10BC&lt;br /&gt;
| ???&lt;br /&gt;
|}&lt;br /&gt;
These are written to when a capture operation is initiated or cancelled. Register 1094 is set to 0 when using the internal clock with sampling rates of 100 MHz and below. For 125 MHz internal clock or the external clock modes, it is set to 1.&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;
!Address&lt;br /&gt;
!Init value&lt;br /&gt;
|-&lt;br /&gt;
| 1074&lt;br /&gt;
| 00000002&lt;br /&gt;
|-&lt;br /&gt;
| 107C&lt;br /&gt;
| 00000000&lt;br /&gt;
|}&lt;br /&gt;
The vendor software writes these two registers during initialization, and also when initiating a capture.&lt;br /&gt;
&lt;br /&gt;
=== Command 0005: Write ??? ===&lt;br /&gt;
&lt;br /&gt;
This command appears to write 16 32-bit words at once. The vendor software issues this after a transfer of captured data to the host has finished, but only for the first three captures. After that, the application needs to be restarted to ever see this command again.&lt;br /&gt;
&lt;br /&gt;
The data written varies each time, but it appears that only the lowest 8 bit of each 32-bit word are ever written. No idea what this might do. It could be calibration feedback or something, although it is hard to imagine how the host could help the device with that. Luckily, the sigrok driver works without ever sending this command at all.&lt;br /&gt;
&lt;br /&gt;
==== Command ====&lt;br /&gt;
&lt;br /&gt;
Fixed length of 33 words (66 bytes).&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;
!ID&lt;br /&gt;
!Data 1&lt;br /&gt;
!Data 2&lt;br /&gt;
!...&lt;br /&gt;
!Data 16&lt;br /&gt;
|-&lt;br /&gt;
| 0005&lt;br /&gt;
| dddd-dddd&lt;br /&gt;
| dddd-dddd&lt;br /&gt;
| ...&lt;br /&gt;
| dddd-dddd&lt;br /&gt;
|}&lt;br /&gt;
The byte order of each 32-bit word is most likely the usual 2-1-4-3 mixed endianess.&lt;br /&gt;
&lt;br /&gt;
==== Sample capture ====&lt;br /&gt;
&lt;br /&gt;
A sample of three such commands from an actual protocol analysis session:&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
 10185	56.455640		Cmd 5: write ??? data C3 9A 4B 91 30 D2 98 C1 CA F2 D7 4F 82 74 C0 8B&lt;br /&gt;
 14155	95.788766		Cmd 5: write ??? data E5 7B 2C F3 6B 06 76 4B 60 94 F3 EC C9 AA E9 35&lt;br /&gt;
 17823	131.101569		Cmd 5: write ??? data 16 66 EA 7B 35 F6 71 A8 0A E0 D7 E7 45 E0 4F 23&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
Only the least significant byte is shown for each 32-bit data word, as the other bytes are always 0. The message content changes with each run of the vendor software. It&amp;#039;s hard to make head or tail of this. However, as this command is issued after all captured data has been retrieved, it cannot possibly affect the preceding capture and read-out operations.&lt;br /&gt;
&lt;br /&gt;
=== Command 0006: Read Memory at Address ===&lt;br /&gt;
&lt;br /&gt;
This command reads a chunk of data from the device memory (SRAM). It allows for random access using a 32-bit start address, and for variable length via a 32-bit length field. The software uses this command to read captured data from the device&amp;#039;s buffer.&lt;br /&gt;
&lt;br /&gt;
==== Command ====&lt;br /&gt;
&lt;br /&gt;
Fixed length of 5 words (10 bytes).&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;
!ID&lt;br /&gt;
!Address&lt;br /&gt;
!Length&lt;br /&gt;
|-&lt;br /&gt;
| 0006&lt;br /&gt;
| aaaa-aaaa&lt;br /&gt;
| nnnn-nnnn&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Both the address and the length are encoded in mixed endian (2-1-4-3) byte order.&lt;br /&gt;
&lt;br /&gt;
==== Response ====&lt;br /&gt;
&lt;br /&gt;
The memory is 36 bit wide, and thus the size of the response in bits is 36 times the value in the length field. The original vendor software reads chunks of 120 words @ 36 bit at a time, which works out to an integer multiple of 32 (i.e. 4320 bits = 135 32-bit words or 540 bytes). The final six reads are done in chunks of 8 words @ 36 bit, which works out to nine 32-bit words or 36 bytes. The overall amount of memory being read when fetching captured samples from a full buffer is just below the RAM size of 256k×36 bit.&lt;br /&gt;
&lt;br /&gt;
Note that the software always starts reading at address 4 rather than 0. Presumably, the firmware uses the first four 36-bit words for internal bookkeeping or some other purpose. Exception to the rule: For some unknown reason (perhaps testing), the memory is also being read on start-up right after loading the firmware into the FPGA. In this case, altogether 128000 36-bit words are being read beginning at address 0.&lt;br /&gt;
&lt;br /&gt;
Note that reading more than 1024 bytes at a time seems to be unreliable. Due to the constraints outlined in the following section, the maximum read length should therefore be restricted to 224 device words, which works out to 1008 bytes.&lt;br /&gt;
&lt;br /&gt;
===== 36-to-32 Bit Mapping =====&lt;br /&gt;
&lt;br /&gt;
The data returned by the read command consists of 32-bit words in 2-1-4-3 mixed endian byte order. Eight consecutive 36-bit words from the SRAM are mapped at a time to nine consecutive 32-bit words in the received stream. The first of these slices aligns to the beginning of the read-out stream, apparently irrespective of the absolute start address of the read operation.&lt;br /&gt;
&lt;br /&gt;
The first eight 32-bit words in a slice contain the lower 32 bit of the eight encoded 36-bit words. The ninth 32-bit word contains the four remaining high bits of all eight 36-bit words combined. The high nibbles are shifted into the ninth word from right to left, resulting in a 1-2-3-4-5-6-7-8 order of nibbles. (This is after conversion from mixed endian byte order!)&lt;br /&gt;
&lt;br /&gt;
As it is necessary to access the ninth 32-bit word in each slice even to fully extract the first 36-bit word, it follows that memory reads should always request a multiple of the slice length, i.e. eight 36-bit words. The length of the response will thus always be a multiple of nine 32-bit words (36 bytes). However, it does not appear to be necessary to restrict read operations to only the two lengths 120 and 8 used by the vendor software.&lt;br /&gt;
&lt;br /&gt;
===== Compression Scheme =====&lt;br /&gt;
&lt;br /&gt;
The compression scheme is a form of run-length encoding. Very short run lengths of only one or two cycles are handled as special cases, which helps to keep the worst-case overhead of compression pretty low. In particular, the scheme ensures that it is never necessary to write more than one 36-bit word per sampling cycle to the SRAM buffer.&lt;br /&gt;
&lt;br /&gt;
Each 36-bit word in the stream is either a data word or a repeat half-count word. The first word in the stream is a data word, with the following layout:&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;
!Bit&lt;br /&gt;
!35&lt;br /&gt;
!34&lt;br /&gt;
!33&lt;br /&gt;
!32&lt;br /&gt;
!31&lt;br /&gt;
!...&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
!Meaning&lt;br /&gt;
| Repeat count follows&lt;br /&gt;
| LSB of repeat count&lt;br /&gt;
| CH34&lt;br /&gt;
| CH33&lt;br /&gt;
| CH32&lt;br /&gt;
| ...&lt;br /&gt;
| CH3&lt;br /&gt;
| CH2&lt;br /&gt;
| CH1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
If bit 35 is set, then the next 36-bit word in the stream encodes the number of cycles the previous data word is repeated, divided by two. The actual number of repeat cycles is twice that number plus the LSB of repeat count, i.e. bit 34 from the data word. If bit 35 is not set the next word is again a data word and the repeat half-count is assumed as zero. However, the LSB of repeat count bit still applies; i.e. if it is set then the repeat count would be 1.&lt;br /&gt;
&lt;br /&gt;
So, to recap, repeat counts 0 to 1 are encoded as part of the channel data word, larger repeat counts use up a full extra 36-bit word. The combined repeat count is then 37 bit wide. At 125 MHz, this scheme would allow for encoding run lengths of more than 18 minutes. However, note that the vendor software does not actually make use of the full range: Apparently, it stops as soon as the count rolls over into bit 36, thereby cutting the maximum possible run length in half (i.e. about 9 minutes at 125 MHz). However, this detail does not make any difference for the decompression algorithm.&lt;br /&gt;
&lt;br /&gt;
The next word following a repeat half-count is again a data word. Note that it is possible for a sample/run-length pair to be split across a slice boundary, or even across successive read chunks. The decoder therefore needs to keep track of RLE state across slices as well as read operations.&lt;br /&gt;
&lt;br /&gt;
=== Command 0007: Capture Setup ===&lt;br /&gt;
&lt;br /&gt;
This command prepares a capture operation. Essentially, this command appears to write to an internal memory block with 64-bit granularity. Command 0008 can be used to read from the same memory.&lt;br /&gt;
&lt;br /&gt;
The vendor software issues this command once during start-up, and once for each capture operation as part of the setup sequence. It is also issued when clicking the Stop button to cancel a capture in progress.&lt;br /&gt;
&lt;br /&gt;
==== Command ====&lt;br /&gt;
&lt;br /&gt;
Variable length of 3 words (6 bytes) plus length × 4 words (8 bytes).&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;
!ID&lt;br /&gt;
!Address&lt;br /&gt;
!Length&lt;br /&gt;
!Data&lt;br /&gt;
!...&lt;br /&gt;
|-&lt;br /&gt;
| 0007&lt;br /&gt;
| aaaa&lt;br /&gt;
| nnnn&lt;br /&gt;
| dddd-dddd-dddd-dddd&lt;br /&gt;
| ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The two argument words are the start address and the length of the slice to write, in little endian byte order. Both the address and the length refer to quantities of 64 bit (4 words or 8 bytes). Thus, if length is 10 the payload should consist of 40 words or 80 bytes.&lt;br /&gt;
&lt;br /&gt;
The vendor software always writes a slice of length 10 beginning at address 0, thus completely resetting both the capture configuration as well as the capture status. The layout of the configuration and status memory is outlined in the description of command 0008.&lt;br /&gt;
&lt;br /&gt;
=== Command 0008: Capture Status ===&lt;br /&gt;
&lt;br /&gt;
This command reads the current capture configuration and status. Essentially, this command appears to read a slice from an internal memory block with 64-bit granularity -- the same memory space command 7 writes to. During idle periods, the software polls the channel state about 34 times per second for its live port status display. During a capture operation, it is necessary to poll the status in order to find out whether the capture buffer has been filled completely and samples can be retrieved.&lt;br /&gt;
&lt;br /&gt;
==== Command ====&lt;br /&gt;
&lt;br /&gt;
Fixed length of 3 words (6 bytes).&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;
!ID&lt;br /&gt;
!Address&lt;br /&gt;
!Length&lt;br /&gt;
|-&lt;br /&gt;
| 0008&lt;br /&gt;
| aaaa&lt;br /&gt;
| nnnn&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The two argument words are the start address and the length of the slice to read, in little endian byte order. Both the address and the length refer to quantities of 64 bit (4 words or 8 bytes). Thus, if length is 10 the reply will consist of 40 words or 80 bytes.&lt;br /&gt;
&lt;br /&gt;
Although the vendor software always reads the full 10 fields of configuration and status information, it does not seem to be an actual requirement. Restricting reads to fields 5 to 9 in the sigrok driver works fine so far without any problems.&lt;br /&gt;
&lt;br /&gt;
==== Response ====&lt;br /&gt;
&lt;br /&gt;
The table below shows the response to the command as issued by the vendor software, i.e. with start address 0 and length 10. Each row is a 64-bit word in very much mixed up (6-5-8-7-2-1-4-3) byte order. Roughly, the first half is used to set up a capture operation, whereas the second half contains status information. Field 5 is an exception, as it is used for both setup and status.&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;
!Index&lt;br /&gt;
!Byte offset&lt;br /&gt;
!Value&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 00&lt;br /&gt;
| Channel enable mask&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 08&lt;br /&gt;
| Clock divider count&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 10&lt;br /&gt;
| Trigger level mask&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| 18&lt;br /&gt;
| Trigger edge mask&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 20&lt;br /&gt;
| Trigger enable mask&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| 28&lt;br /&gt;
| Capture memory fill level&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| 30&lt;br /&gt;
| Not used?&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| 38&lt;br /&gt;
| Running capture duration&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 40&lt;br /&gt;
| Channel input state&lt;br /&gt;
|-&lt;br /&gt;
| 9&lt;br /&gt;
| 48&lt;br /&gt;
| Capture status flags&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The channel enable mask and the input state are bit vectors, with bit 0 of the 64-bit word (after unmixing the byte order!) corresponding to CH1 and bit 33 corresponding to CH34. The enable mask shows which channels have been enabled for capturing. The bits in the input state vector signify whether the voltage at the corresponding input channels is currently low (0) or high (1).&lt;br /&gt;
&lt;br /&gt;
Field 1 sets the max value of the counter which divides the internal clock to yield the sampling clock. This applies to all sample rates of 100MHz or less (125MHz is a special case: see control register 1094). The counter max value is calculated as follows: maxcount = 1 / (samplefreq * 10ns) - 1&lt;br /&gt;
&lt;br /&gt;
Field 4 is the trigger enable mask. 1 enables triggering on a channel, 0 disables it. CH1 is mapped to bit 0 and CH34 to bit 33. Bits 34 and 35 are special and configure for external triggering. Bit 34 enables external triggering on the falling edge, bit 35 on the rising edge.&lt;br /&gt;
&lt;br /&gt;
If a trigger channel is enabled, the corresponding bit in field 3 configures whether to trigger on level (0) or edge (1). The corresponding bit in field 2 then selects whether to trigger on low/falling (0) or high/rising (1).&lt;br /&gt;
&lt;br /&gt;
During setup, field 5 is used to limit the (compressed) size of the captured data. During a running capture operation, field 5 indicates the current memory fill level.&lt;br /&gt;
&lt;br /&gt;
Field 7 is the time passed since the first sample. For samplerates up to 100 MHz, the value is a duration in milliseconds. The 125 MHz setting is again special and uses the same timebase as the 100 MHz setting, i.e. field 7 can then be interpreted as the sample count × 10&amp;lt;sup&amp;gt;−5&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Field 8 records a snapshot of the signal level of all 34 channels at the time the status is being read.&lt;br /&gt;
&lt;br /&gt;
Field 6 appears to be unused.&lt;br /&gt;
&lt;br /&gt;
===== Capture Status Flags =====&lt;br /&gt;
&lt;br /&gt;
The status flag bits are used as follows:&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;
!Bit 0&lt;br /&gt;
!Bit 1&lt;br /&gt;
!Bit 2&lt;br /&gt;
!Bit 3&lt;br /&gt;
!Bit 4&lt;br /&gt;
!Bit 5&lt;br /&gt;
|-&lt;br /&gt;
| ???&lt;br /&gt;
| Capturing&lt;br /&gt;
| ???&lt;br /&gt;
| ???&lt;br /&gt;
| Triggered&lt;br /&gt;
| Memory available&lt;br /&gt;
|}&lt;br /&gt;
The higher bits of field 9 appear to contain garbage (apparently copies of the bits from field 8).&lt;br /&gt;
&lt;br /&gt;
== Task Recipes ==&lt;br /&gt;
&lt;br /&gt;
This section lists the commands issued by the software to perform a particular task.&lt;br /&gt;
&lt;br /&gt;
=== Long Register Read ===&lt;br /&gt;
&lt;br /&gt;
This sequence reads from a 64-bit wide internal memory, probably the same as that accessed by commands 7 and 8.&lt;br /&gt;
&lt;br /&gt;
# Write index to address register 0x10B4&lt;br /&gt;
# Read dummy value from strobe register 0x10B0&lt;br /&gt;
# Read high word from register 0x10BC&lt;br /&gt;
# Read low word from register 0x10B8&lt;br /&gt;
&lt;br /&gt;
Steps 3 and 4 appear to be interchangeable.&lt;br /&gt;
&lt;br /&gt;
=== Long Register Write ===&lt;br /&gt;
&lt;br /&gt;
This sequence writes to a 64-bit wide internal memory, probably the same as that accessed by commands 7 and 8.&lt;br /&gt;
&lt;br /&gt;
# Write index to address register 0x10B4&lt;br /&gt;
# Write low word to register 0x10B8&lt;br /&gt;
# Write high word to register 0x10BC&lt;br /&gt;
# Write 0 (dummy value) to strobe register 0x10B0&lt;br /&gt;
&lt;br /&gt;
Steps 3 and 4 appear to be interchangeable.&lt;br /&gt;
&lt;br /&gt;
=== Initialization ===&lt;br /&gt;
&lt;br /&gt;
# Acquire control of USB device and select configuration 1&lt;br /&gt;
# Send FPGA bitstream (default: internal clock) to EP 4 via bulk transfer&lt;br /&gt;
# Device test sequence:&lt;br /&gt;
## Read long register 100; ignore result&lt;br /&gt;
## Read long register 100; result should be 0x1234567887654321&lt;br /&gt;
# Capture setup/state test (vendor software does this, not mandatory):&lt;br /&gt;
## Write sequence 0..9 to capture setup fields (via command 7)&lt;br /&gt;
## Read back capture state (via command 8): 0..4 should be read back as is, 5..9 are trashed anyway&lt;br /&gt;
# Memory test (vendor software does this, not mandatory):&lt;br /&gt;
## Write 2 to register 0x1074&lt;br /&gt;
## Write 0 to register 0x107C&lt;br /&gt;
## Read memory beginning at address 0 in chunks of 120 36-bit words, up to but not including 0x013FB0&lt;br /&gt;
## Read memory beginning at address 0x013FB0 in chunks of 8 36-bit words, up to but not including 0x014000&lt;br /&gt;
&lt;br /&gt;
It does not seem to be necessary to use exactly the same read chunk length as the original vendor software. See the description of command 6 for constraints.&lt;br /&gt;
&lt;br /&gt;
=== Poll channel state ===&lt;br /&gt;
&lt;br /&gt;
The vendor software continuously polls the channel state even when idle. However, it is not mandatory to do so.&lt;br /&gt;
&lt;br /&gt;
# Poll frequency of signal at CH1 to CH4:&lt;br /&gt;
## Read register 0x10C0: value is frequency of CH1 signal&lt;br /&gt;
## Read register 0x10C4: value is frequency of CH2 signal&lt;br /&gt;
## Read register 0x10C8: value is frequency of CH3 signal&lt;br /&gt;
## Read register 0x10CC: value is frequency of CH4 signal&lt;br /&gt;
# Poll signal level of all channels:&lt;br /&gt;
## Read capture state (via command 8): the signal level of all channels is recorded in field 8&lt;br /&gt;
&lt;br /&gt;
=== Clocking Mode Switch ===&lt;br /&gt;
&lt;br /&gt;
# Transfer one of three FPGA bitstreams to EP 4:&lt;br /&gt;
## Configuration for internal clock&lt;br /&gt;
## Configuration for external clock, rising edge&lt;br /&gt;
## Configuration for external clock, falling edge&lt;br /&gt;
&lt;br /&gt;
=== Signal Capture ===&lt;br /&gt;
&lt;br /&gt;
# Write 2 to register 0x1074&lt;br /&gt;
# Write 1 to register 0x1074&lt;br /&gt;
# Write 0x74 to long register 10&lt;br /&gt;
# Write divider bypass flag to register 0x1094 (see description of register)&lt;br /&gt;
# Write capture setup (command 7, address 0, length 10: see description of command)&lt;br /&gt;
# Write 1 to long register 10&lt;br /&gt;
# Wait for capture to finish:&lt;br /&gt;
## Poll capture state (command 8, address 0, length 10: see description of command)&lt;br /&gt;
## Report progress information (got trigger, cycles elapsed, memory fill percentage) to user&lt;br /&gt;
## Capture has finished once the memory available flag is reset&lt;br /&gt;
&lt;br /&gt;
=== Cancel Signal Capture ===&lt;br /&gt;
&lt;br /&gt;
# Write 0 to long register 10&lt;br /&gt;
# Write 0 to register 0x1094 (divider bypass flag)&lt;br /&gt;
&lt;br /&gt;
After that, the memory available flag in the capture state should have been cleared. Continue in the same manner as for a regularly finished capture.&lt;br /&gt;
&lt;br /&gt;
=== Read Captured Data ===&lt;br /&gt;
&lt;br /&gt;
# Read register 0x1078: value is the number of 36-bit words in the capture buffer&lt;br /&gt;
# Write 1 to register 0x1094 (divider bypass flag)&lt;br /&gt;
# Write 2 to register 0x1074&lt;br /&gt;
# Write 4 to register 0x107C&lt;br /&gt;
# Read capture buffer:&lt;br /&gt;
## Read memory beginning at address 4 in chunks of 120 36-bit words, up to but not including 0x03FFC4&lt;br /&gt;
## Read memory beginning at address 0x03FFC4 in chunks of 8 36-bit words, up to but not including 0x03FFF4&lt;br /&gt;
# Write 0 to register 0x1094 (divider bypass flag)&lt;br /&gt;
# Issue mystery command 5 with mystery data, but for some mystical reason only for the first three captures after application start&lt;br /&gt;
&lt;br /&gt;
It does not seem to be necessary to use exactly the same read chunk length as the original vendor software. See the description of command 6 for constraints.&lt;br /&gt;
&lt;br /&gt;
The sigrok driver works fine without ever issuing mystery command 5.&lt;br /&gt;
&lt;br /&gt;
=== Shutdown ===&lt;br /&gt;
&lt;br /&gt;
1. Transfer FPGA configuration for device shutdown to EP 4&lt;/div&gt;</summary>
		<author><name>Danielk</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=Sysclk_LWLA1034/Protocol&amp;diff=11175</id>
		<title>Sysclk LWLA1034/Protocol</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=Sysclk_LWLA1034/Protocol&amp;diff=11175"/>
		<updated>2015-10-25T11:34:56Z</updated>

		<summary type="html">&lt;p&gt;Danielk: Document long register read/write&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== FPGA Configuration ==&lt;br /&gt;
&lt;br /&gt;
The FPGA bitstream is loaded via bulk transfer to USB end point 4. Each firmware transfer starts with a 4-byte header to announce the transfer size. The payload appears to be a Raw Binary File (.rbf) with compression enabled.&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;
!Length&lt;br /&gt;
!Payload...&lt;br /&gt;
|-&lt;br /&gt;
| nnnn-nnnn&lt;br /&gt;
| dd...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Unlike the control commands, the firmware transfer is apparently byte-based. The length is a byte count encoded in big endian (1-2-3-4) byte order, and includes the size of the length field (4 bytes) itself.&lt;br /&gt;
&lt;br /&gt;
=== Application Behavior ===&lt;br /&gt;
&lt;br /&gt;
The vendor software transfers a new bitstream to the FPGA&lt;br /&gt;
# on application start,&lt;br /&gt;
# when switching clocking mode between internal, external/rising or external/falling,&lt;br /&gt;
# on application exit.&lt;br /&gt;
&lt;br /&gt;
The size of the bitstream varies due to compression, but is in the order of 50kB to 80kB. The firmware transfer is split by the vendor software into packets with 15 byte payload each and thus takes quite a bit of time inside VirtualBox. Testing with a libusb-based tool for issuing USB bulk transfers has shown that this does not appear to be necessary: Transferring even the entire firmware blob in a single bulk transfer appears to work without error.&lt;br /&gt;
=== Firmware Extraction ===&lt;br /&gt;
&lt;br /&gt;
The firmware blobs can be extracted directly from the Windows installer executable located on the CD-ROM that ships with the device.  The file &amp;lt;tt&amp;gt;lwla1034_EN_setup.exe&amp;lt;/tt&amp;gt; on the CD-ROM from 2012-07-12 has the firmware blobs located at the following offsets:&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;
!Offset&lt;br /&gt;
!Length&lt;br /&gt;
!Mode&lt;br /&gt;
|-&lt;br /&gt;
| 34110338&lt;br /&gt;
| 78398&lt;br /&gt;
| Internal clock&lt;br /&gt;
|-&lt;br /&gt;
| 34266237&lt;br /&gt;
| 78247&lt;br /&gt;
| External clock (rising edge)&lt;br /&gt;
|-&lt;br /&gt;
| 34344484&lt;br /&gt;
| 79145&lt;br /&gt;
| External clock (falling edge)&lt;br /&gt;
|-&lt;br /&gt;
| 34578631&lt;br /&gt;
| 48525&lt;br /&gt;
| Shutdown&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Both offsets and lengths are in bytes. The extracted blobs already include the header with the 32-bit length field.&lt;br /&gt;
&lt;br /&gt;
== Control Commands ==&lt;br /&gt;
&lt;br /&gt;
Control commands are sent via bulk transfer to USB end point 2, with the response (if any) coming in from end point 6.&lt;br /&gt;
&lt;br /&gt;
Command messages are sent to the device as a sequence of 16-bit words with little endian byte order. The first word in a message identifies the command type. Different command types have different message lengths. Some command types include a length field and allow for messages of variable length, others are of fixed size.&lt;br /&gt;
&lt;br /&gt;
There are read commands which trigger an immediate response from the device, and write commands without a response.&lt;br /&gt;
&lt;br /&gt;
=== Command 0001: Read Register ===&lt;br /&gt;
&lt;br /&gt;
This command reads a 32-bit wide control register.&lt;br /&gt;
&lt;br /&gt;
==== Command ====&lt;br /&gt;
&lt;br /&gt;
Fixed length of 2 words (4 bytes).&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;
!ID&lt;br /&gt;
!Address&lt;br /&gt;
|-&lt;br /&gt;
| 0001&lt;br /&gt;
| aaaa&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Response ====&lt;br /&gt;
&lt;br /&gt;
The response has a fixed length of 2 words (4 bytes). It is the content of a 32-bit register in mixed endian (2-1-4-3) byte order.&lt;br /&gt;
&lt;br /&gt;
==== Registers ====&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;
!Address&lt;br /&gt;
!Value&lt;br /&gt;
|-&lt;br /&gt;
| 10C0&lt;br /&gt;
| Channel 1 frequency counter&lt;br /&gt;
|-&lt;br /&gt;
| 10C4&lt;br /&gt;
| Channel 2 frequency counter&lt;br /&gt;
|-&lt;br /&gt;
| 10C8&lt;br /&gt;
| Channel 3 frequency counter&lt;br /&gt;
|-&lt;br /&gt;
| 10CC&lt;br /&gt;
| Channel 4 frequency counter&lt;br /&gt;
|}&lt;br /&gt;
These registers apparently count the number of rising (or falling?) clock edges on channels 1 to 4. The vendor software polls these counters every second to display a live frequency count for the first four channels.&lt;br /&gt;
&lt;br /&gt;
It is unclear what time base is being used for those counters: The large error (sometimes by more than 20%, especially for CH1) hints at I/O latency, which would imply that the software resets the counters. However, manual testing of single register reads has shown that the values do not seem to scale with the time between reads. This would mean the device is using an internal time base after all. However, that makes the large error a bit hard to explain, especially since the error is different for each channel despite being driven by the same signal source.&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;
!Address&lt;br /&gt;
!Selftest value&lt;br /&gt;
|-&lt;br /&gt;
| 10B0&lt;br /&gt;
| 12345678&lt;br /&gt;
|-&lt;br /&gt;
| 10BC&lt;br /&gt;
| 12345678&lt;br /&gt;
|-&lt;br /&gt;
| 10B8&lt;br /&gt;
| 87654321&lt;br /&gt;
|}&lt;br /&gt;
These three registers assume the values listed here after writing 100 (decimal) to register 10B4. This is apparently an identification and self-test sequence, which is performed twice in a row during initialization. After initialization, these registers are part of command sequences which initiate device operations, like capture start/stop.&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;
!Address&lt;br /&gt;
!Value&lt;br /&gt;
|-&lt;br /&gt;
| 1078&lt;br /&gt;
| Capture size (number of 36-bit words)&lt;br /&gt;
|}&lt;br /&gt;
This register holds the (compressed) size of the captured data. The vendor software retrieves this just before fetching the SRAM content.&lt;br /&gt;
&lt;br /&gt;
=== Command 0002: Write Register ===&lt;br /&gt;
&lt;br /&gt;
This command writes a 32-bit value to a control register.&lt;br /&gt;
&lt;br /&gt;
==== Command ====&lt;br /&gt;
&lt;br /&gt;
Fixed length of 4 words (8 bytes).&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;
!ID&lt;br /&gt;
!Address&lt;br /&gt;
!Data&lt;br /&gt;
|-&lt;br /&gt;
| 0002&lt;br /&gt;
| aaaa&lt;br /&gt;
| dddd-dddd&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The value is encoded in mixed endian (2-1-4-3) byte order.&lt;br /&gt;
&lt;br /&gt;
==== Registers ====&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;
!Address&lt;br /&gt;
!Init value&lt;br /&gt;
|-&lt;br /&gt;
| 10B4&lt;br /&gt;
| 00000064&lt;br /&gt;
|}&lt;br /&gt;
The vendor software writes the value 100 (decimal) to this register during initialization into order to start the self test sequence. After that, the magic register values listed in the table for command 0001 become available. So, this is kind of a command-triggering register, and there are other command codes, too.&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;
!Address&lt;br /&gt;
!Purpose&lt;br /&gt;
|-&lt;br /&gt;
| 1094&lt;br /&gt;
| Bypass clock divider&lt;br /&gt;
|-&lt;br /&gt;
| 10B4&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 10B8&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 10BC&lt;br /&gt;
| ???&lt;br /&gt;
|}&lt;br /&gt;
These are written to when a capture operation is initiated or cancelled. Register 1094 is set to 0 when using the internal clock with sampling rates of 100 MHz and below. For 125 MHz internal clock or the external clock modes, it is set to 1.&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;
!Address&lt;br /&gt;
!Init value&lt;br /&gt;
|-&lt;br /&gt;
| 1074&lt;br /&gt;
| 00000002&lt;br /&gt;
|-&lt;br /&gt;
| 107C&lt;br /&gt;
| 00000000&lt;br /&gt;
|}&lt;br /&gt;
The vendor software writes these two registers during initialization, and also when initiating a capture.&lt;br /&gt;
&lt;br /&gt;
=== Command 0005: Write ??? ===&lt;br /&gt;
&lt;br /&gt;
This command appears to write 16 32-bit words at once. The vendor software issues this after a transfer of captured data to the host has finished, but only for the first three captures. After that, the application needs to be restarted to ever see this command again.&lt;br /&gt;
&lt;br /&gt;
The data written varies each time, but it appears that only the lowest 8 bit of each 32-bit word are ever written. No idea what this might do. It could be calibration feedback or something, although it is hard to imagine how the host could help the device with that. Luckily, the sigrok driver works without ever sending this command at all.&lt;br /&gt;
&lt;br /&gt;
==== Command ====&lt;br /&gt;
&lt;br /&gt;
Fixed length of 33 words (66 bytes).&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;
!ID&lt;br /&gt;
!Data 1&lt;br /&gt;
!Data 2&lt;br /&gt;
!...&lt;br /&gt;
!Data 16&lt;br /&gt;
|-&lt;br /&gt;
| 0005&lt;br /&gt;
| dddd-dddd&lt;br /&gt;
| dddd-dddd&lt;br /&gt;
| ...&lt;br /&gt;
| dddd-dddd&lt;br /&gt;
|}&lt;br /&gt;
The byte order of each 32-bit word is most likely the usual 2-1-4-3 mixed endianess.&lt;br /&gt;
&lt;br /&gt;
==== Sample capture ====&lt;br /&gt;
&lt;br /&gt;
A sample of three such commands from an actual protocol analysis session:&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
 10185	56.455640		Cmd 5: write ??? data C3 9A 4B 91 30 D2 98 C1 CA F2 D7 4F 82 74 C0 8B&lt;br /&gt;
 14155	95.788766		Cmd 5: write ??? data E5 7B 2C F3 6B 06 76 4B 60 94 F3 EC C9 AA E9 35&lt;br /&gt;
 17823	131.101569		Cmd 5: write ??? data 16 66 EA 7B 35 F6 71 A8 0A E0 D7 E7 45 E0 4F 23&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
Only the least significant byte is shown for each 32-bit data word, as the other bytes are always 0. The message content changes with each run of the vendor software. It&amp;#039;s hard to make head or tail of this. However, as this command is issued after all captured data has been retrieved, it cannot possibly affect the preceding capture and read-out operations.&lt;br /&gt;
&lt;br /&gt;
=== Command 0006: Read Memory at Address ===&lt;br /&gt;
&lt;br /&gt;
This command reads a chunk of data from the device memory (SRAM). It allows for random access using a 32-bit start address, and for variable length via a 32-bit length field. The software uses this command to read captured data from the device&amp;#039;s buffer.&lt;br /&gt;
&lt;br /&gt;
==== Command ====&lt;br /&gt;
&lt;br /&gt;
Fixed length of 5 words (10 bytes).&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;
!ID&lt;br /&gt;
!Address&lt;br /&gt;
!Length&lt;br /&gt;
|-&lt;br /&gt;
| 0006&lt;br /&gt;
| aaaa-aaaa&lt;br /&gt;
| nnnn-nnnn&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Both the address and the length are encoded in mixed endian (2-1-4-3) byte order.&lt;br /&gt;
&lt;br /&gt;
==== Response ====&lt;br /&gt;
&lt;br /&gt;
The memory is 36 bit wide, and thus the size of the response in bits is 36 times the value in the length field. The original vendor software reads chunks of 120 words @ 36 bit at a time, which works out to an integer multiple of 32 (i.e. 4320 bits = 135 32-bit words or 540 bytes). The final six reads are done in chunks of 8 words @ 36 bit, which works out to nine 32-bit words or 36 bytes. The overall amount of memory being read when fetching captured samples from a full buffer is just below the RAM size of 256k×36 bit.&lt;br /&gt;
&lt;br /&gt;
Note that the software always starts reading at address 4 rather than 0. Presumably, the firmware uses the first four 36-bit words for internal bookkeeping or some other purpose. Exception to the rule: For some unknown reason (perhaps testing), the memory is also being read on start-up right after loading the firmware into the FPGA. In this case, altogether 128000 36-bit words are being read beginning at address 0.&lt;br /&gt;
&lt;br /&gt;
Note that reading more than 1024 bytes at a time seems to be unreliable. Due to the constraints outlined in the following section, the maximum read length should therefore be restricted to 224 device words, which works out to 1008 bytes.&lt;br /&gt;
&lt;br /&gt;
===== 36-to-32 Bit Mapping =====&lt;br /&gt;
&lt;br /&gt;
The data returned by the read command consists of 32-bit words in 2-1-4-3 mixed endian byte order. Eight consecutive 36-bit words from the SRAM are mapped at a time to nine consecutive 32-bit words in the received stream. The first of these slices aligns to the beginning of the read-out stream, apparently irrespective of the absolute start address of the read operation.&lt;br /&gt;
&lt;br /&gt;
The first eight 32-bit words in a slice contain the lower 32 bit of the eight encoded 36-bit words. The ninth 32-bit word contains the four remaining high bits of all eight 36-bit words combined. The high nibbles are shifted into the ninth word from right to left, resulting in a 1-2-3-4-5-6-7-8 order of nibbles. (This is after conversion from mixed endian byte order!)&lt;br /&gt;
&lt;br /&gt;
As it is necessary to access the ninth 32-bit word in each slice even to fully extract the first 36-bit word, it follows that memory reads should always request a multiple of the slice length, i.e. eight 36-bit words. The length of the response will thus always be a multiple of nine 32-bit words (36 bytes). However, it does not appear to be necessary to restrict read operations to only the two lengths 120 and 8 used by the vendor software.&lt;br /&gt;
&lt;br /&gt;
===== Compression Scheme =====&lt;br /&gt;
&lt;br /&gt;
The compression scheme is a form of run-length encoding. Very short run lengths of only one or two cycles are handled as special cases, which helps to keep the worst-case overhead of compression pretty low. In particular, the scheme ensures that it is never necessary to write more than one 36-bit word per sampling cycle to the SRAM buffer.&lt;br /&gt;
&lt;br /&gt;
Each 36-bit word in the stream is either a data word or a repeat half-count word. The first word in the stream is a data word, with the following layout:&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;
!Bit&lt;br /&gt;
!35&lt;br /&gt;
!34&lt;br /&gt;
!33&lt;br /&gt;
!32&lt;br /&gt;
!31&lt;br /&gt;
!...&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
!Meaning&lt;br /&gt;
| Repeat count follows&lt;br /&gt;
| LSB of repeat count&lt;br /&gt;
| CH34&lt;br /&gt;
| CH33&lt;br /&gt;
| CH32&lt;br /&gt;
| ...&lt;br /&gt;
| CH3&lt;br /&gt;
| CH2&lt;br /&gt;
| CH1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
If bit 35 is set, then the next 36-bit word in the stream encodes the number of cycles the previous data word is repeated, divided by two. The actual number of repeat cycles is twice that number plus the LSB of repeat count, i.e. bit 34 from the data word. If bit 35 is not set the next word is again a data word and the repeat half-count is assumed as zero. However, the LSB of repeat count bit still applies; i.e. if it is set then the repeat count would be 1.&lt;br /&gt;
&lt;br /&gt;
So, to recap, repeat counts 0 to 1 are encoded as part of the channel data word, larger repeat counts use up a full extra 36-bit word. The combined repeat count is then 37 bit wide. At 125 MHz, this scheme would allow for encoding run lengths of more than 18 minutes. However, note that the vendor software does not actually make use of the full range: Apparently, it stops as soon as the count rolls over into bit 36, thereby cutting the maximum possible run length in half (i.e. about 9 minutes at 125 MHz). However, this detail does not make any difference for the decompression algorithm.&lt;br /&gt;
&lt;br /&gt;
The next word following a repeat half-count is again a data word. Note that it is possible for a sample/run-length pair to be split across a slice boundary, or even across successive read chunks. The decoder therefore needs to keep track of RLE state across slices as well as read operations.&lt;br /&gt;
&lt;br /&gt;
=== Command 0007: Capture Setup ===&lt;br /&gt;
&lt;br /&gt;
This command prepares a capture operation. Essentially, this command appears to write to an internal memory block with 64-bit granularity. Command 0008 can be used to read from the same memory.&lt;br /&gt;
&lt;br /&gt;
The vendor software issues this command once during start-up, and once for each capture operation as part of the setup sequence. It is also issued when clicking the Stop button to cancel a capture in progress.&lt;br /&gt;
&lt;br /&gt;
==== Command ====&lt;br /&gt;
&lt;br /&gt;
Variable length of 3 words (6 bytes) plus length × 4 words (8 bytes).&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;
!ID&lt;br /&gt;
!Address&lt;br /&gt;
!Length&lt;br /&gt;
!Data&lt;br /&gt;
!...&lt;br /&gt;
|-&lt;br /&gt;
| 0007&lt;br /&gt;
| aaaa&lt;br /&gt;
| nnnn&lt;br /&gt;
| dddd-dddd-dddd-dddd&lt;br /&gt;
| ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The two argument words are the start address and the length of the slice to write, in little endian byte order. Both the address and the length refer to quantities of 64 bit (4 words or 8 bytes). Thus, if length is 10 the payload should consist of 40 words or 80 bytes.&lt;br /&gt;
&lt;br /&gt;
The vendor software always writes a slice of length 10 beginning at address 0, thus completely resetting both the capture configuration as well as the capture status. The layout of the configuration and status memory is outlined in the description of command 0008.&lt;br /&gt;
&lt;br /&gt;
=== Command 0008: Capture Status ===&lt;br /&gt;
&lt;br /&gt;
This command reads the current capture configuration and status. Essentially, this command appears to read a slice from an internal memory block with 64-bit granularity -- the same memory space command 7 writes to. During idle periods, the software polls the channel state about 34 times per second for its live port status display. During a capture operation, it is necessary to poll the status in order to find out whether the capture buffer has been filled completely and samples can be retrieved.&lt;br /&gt;
&lt;br /&gt;
==== Command ====&lt;br /&gt;
&lt;br /&gt;
Fixed length of 3 words (6 bytes).&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;
!ID&lt;br /&gt;
!Address&lt;br /&gt;
!Length&lt;br /&gt;
|-&lt;br /&gt;
| 0008&lt;br /&gt;
| aaaa&lt;br /&gt;
| nnnn&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The two argument words are the start address and the length of the slice to read, in little endian byte order. Both the address and the length refer to quantities of 64 bit (4 words or 8 bytes). Thus, if length is 10 the reply will consist of 40 words or 80 bytes.&lt;br /&gt;
&lt;br /&gt;
Although the vendor software always reads the full 10 fields of configuration and status information, it does not seem to be an actual requirement. Restricting reads to fields 5 to 9 in the sigrok driver works fine so far without any problems.&lt;br /&gt;
&lt;br /&gt;
==== Response ====&lt;br /&gt;
&lt;br /&gt;
The table below shows the response to the command as issued by the vendor software, i.e. with start address 0 and length 10. Each row is a 64-bit word in very much mixed up (6-5-8-7-2-1-4-3) byte order. Roughly, the first half is used to set up a capture operation, whereas the second half contains status information. Field 5 is an exception, as it is used for both setup and status.&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;
!Index&lt;br /&gt;
!Byte offset&lt;br /&gt;
!Value&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 00&lt;br /&gt;
| Channel enable mask&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 08&lt;br /&gt;
| Clock divider count&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 10&lt;br /&gt;
| Trigger level mask&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| 18&lt;br /&gt;
| Trigger edge mask&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 20&lt;br /&gt;
| Trigger enable mask&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| 28&lt;br /&gt;
| Capture memory fill level&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| 30&lt;br /&gt;
| Not used?&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| 38&lt;br /&gt;
| Running capture duration&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 40&lt;br /&gt;
| Channel input state&lt;br /&gt;
|-&lt;br /&gt;
| 9&lt;br /&gt;
| 48&lt;br /&gt;
| Capture status flags&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The channel enable mask and the input state are bit vectors, with bit 0 of the 64-bit word (after unmixing the byte order!) corresponding to CH1 and bit 33 corresponding to CH34. The enable mask shows which channels have been enabled for capturing. The bits in the input state vector signify whether the voltage at the corresponding input channels is currently low (0) or high (1).&lt;br /&gt;
&lt;br /&gt;
Field 1 sets the max value of the counter which divides the internal clock to yield the sampling clock. This applies to all sample rates of 100MHz or less (125MHz is a special case: see control register 1094). The counter max value is calculated as follows: maxcount = 1 / (samplefreq * 10ns) - 1&lt;br /&gt;
&lt;br /&gt;
Field 4 is the trigger enable mask. 1 enables triggering on a channel, 0 disables it. CH1 is mapped to bit 0 and CH34 to bit 33. Bits 34 and 35 are special and configure for external triggering. Bit 34 enables external triggering on the falling edge, bit 35 on the rising edge.&lt;br /&gt;
&lt;br /&gt;
If a trigger channel is enabled, the corresponding bit in field 3 configures whether to trigger on level (0) or edge (1). The corresponding bit in field 2 then selects whether to trigger on low/falling (0) or high/rising (1).&lt;br /&gt;
&lt;br /&gt;
During setup, field 5 is used to limit the (compressed) size of the captured data. During a running capture operation, field 5 indicates the current memory fill level.&lt;br /&gt;
&lt;br /&gt;
Field 7 is the time passed since the first sample. For samplerates up to 100 MHz, the value is a duration in milliseconds. The 125 MHz setting is again special and uses the same timebase as the 100 MHz setting, i.e. field 7 can then be interpreted as the sample count × 10&amp;lt;sup&amp;gt;−5&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Field 8 records a snapshot of the signal level of all 34 channels at the time the status is being read.&lt;br /&gt;
&lt;br /&gt;
Field 6 appears to be unused.&lt;br /&gt;
&lt;br /&gt;
===== Capture Status Flags =====&lt;br /&gt;
&lt;br /&gt;
The status flag bits are used as follows:&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;
!Bit 0&lt;br /&gt;
!Bit 1&lt;br /&gt;
!Bit 2&lt;br /&gt;
!Bit 3&lt;br /&gt;
!Bit 4&lt;br /&gt;
!Bit 5&lt;br /&gt;
|-&lt;br /&gt;
| ???&lt;br /&gt;
| Capturing&lt;br /&gt;
| ???&lt;br /&gt;
| ???&lt;br /&gt;
| Triggered&lt;br /&gt;
| Memory available&lt;br /&gt;
|}&lt;br /&gt;
The higher bits of field 9 appear to contain garbage (apparently copies of the bits from field 8).&lt;br /&gt;
&lt;br /&gt;
== Task Recipes ==&lt;br /&gt;
&lt;br /&gt;
This section lists the commands issued by the software to perform a particular task.&lt;br /&gt;
&lt;br /&gt;
=== Long Register Read ===&lt;br /&gt;
&lt;br /&gt;
This sequence reads from a 64-bit wide internal memory, probably the same as that accessed by commands 7 and 8.&lt;br /&gt;
&lt;br /&gt;
# Write index to address register 0x10B4&lt;br /&gt;
# Read dummy value from strobe register 0x10B0&lt;br /&gt;
# Read high word from register 0x10BC&lt;br /&gt;
# Read low word from register 0x10B8&lt;br /&gt;
&lt;br /&gt;
Steps 3 and 4 appear to be interchangeable.&lt;br /&gt;
&lt;br /&gt;
=== Long Register Write ===&lt;br /&gt;
&lt;br /&gt;
This sequence writes to a 64-bit wide internal memory, probably the same as that accessed by commands 7 and 8.&lt;br /&gt;
&lt;br /&gt;
# Write index to address register 0x10B4&lt;br /&gt;
# Write low word to register 0x10B8&lt;br /&gt;
# Write high word to register 0x10BC&lt;br /&gt;
# Write 0 (dummy value) to strobe register 0x10B0&lt;br /&gt;
&lt;br /&gt;
Steps 3 and 4 appear to be interchangeable.&lt;br /&gt;
&lt;br /&gt;
=== Initialization ===&lt;br /&gt;
&lt;br /&gt;
# Acquire control of USB device and select configuration 1&lt;br /&gt;
# Send FPGA bitstream (default: internal clock) to EP 4 via bulk transfer&lt;br /&gt;
# Device test sequence (performed twice by vendor software, only the results of the second run should be checked):&lt;br /&gt;
## Write 100 to register 0x10B4&lt;br /&gt;
## Read register 0x10B0: value should be ignored&lt;br /&gt;
## Read register 0x10BC: value should be 0x12345678&lt;br /&gt;
## Read register 0x10B8: value should be 0x87654321&lt;br /&gt;
# Capture setup/state test (vendor software does this, not mandatory):&lt;br /&gt;
## Write sequence 0..9 to capture setup fields (via command 7)&lt;br /&gt;
## Read back capture state (via command 8): 0..4 should be read back as is, 5..9 are trashed anyway&lt;br /&gt;
# Memory test (vendor software does this, not mandatory):&lt;br /&gt;
## Write 2 to register 0x1074&lt;br /&gt;
## Write 0 to register 0x107C&lt;br /&gt;
## Read memory beginning at address 0 in chunks of 120 36-bit words, up to but not including 0x013FB0&lt;br /&gt;
## Read memory beginning at address 0x013FB0 in chunks of 8 36-bit words, up to but not including 0x014000&lt;br /&gt;
&lt;br /&gt;
It does not seem to be necessary to use exactly the same read chunk length as the original vendor software. See the description of command 6 for constraints.&lt;br /&gt;
&lt;br /&gt;
=== Poll channel state ===&lt;br /&gt;
&lt;br /&gt;
The vendor software continuously polls the channel state even when idle. However, it is not mandatory to do so.&lt;br /&gt;
&lt;br /&gt;
# Poll frequency of signal at CH1 to CH4:&lt;br /&gt;
## Read register 0x10C0: value is frequency of CH1 signal&lt;br /&gt;
## Read register 0x10C4: value is frequency of CH2 signal&lt;br /&gt;
## Read register 0x10C8: value is frequency of CH3 signal&lt;br /&gt;
## Read register 0x10CC: value is frequency of CH4 signal&lt;br /&gt;
# Poll signal level of all channels:&lt;br /&gt;
## Read capture state (via command 8): the signal level of all channels is recorded in field 8&lt;br /&gt;
&lt;br /&gt;
=== Clocking Mode Switch ===&lt;br /&gt;
&lt;br /&gt;
# Transfer one of three FPGA bitstreams to EP 4:&lt;br /&gt;
## Configuration for internal clock&lt;br /&gt;
## Configuration for external clock, rising edge&lt;br /&gt;
## Configuration for external clock, falling edge&lt;br /&gt;
&lt;br /&gt;
=== Signal Capture ===&lt;br /&gt;
&lt;br /&gt;
# Write 2 to register 0x1074&lt;br /&gt;
# Write 1 to register 0x1074 (previous write may be redundant, needs testing)&lt;br /&gt;
# Write 10 to register 0x10B4&lt;br /&gt;
# Write 0x74 to register 0x10B8&lt;br /&gt;
# Write 0 to register 0x10BC&lt;br /&gt;
# Write 0 to register 0x10B0&lt;br /&gt;
# Write divider bypass flag to register 0x1094 (see description of register)&lt;br /&gt;
# Write capture setup (command 7, address 0, length 10: see description of command)&lt;br /&gt;
# Write 10 to register 0x10B4&lt;br /&gt;
# Write 1 to register 0x10B8&lt;br /&gt;
# Write 0 to register 0x10BC&lt;br /&gt;
# Write 0 to register 0x10B0&lt;br /&gt;
# Wait for capture to finish:&lt;br /&gt;
## Poll capture state (command 8, address 0, length 10: see description of command)&lt;br /&gt;
## Report progress information (got trigger, cycles elapsed, memory fill percentage) to user&lt;br /&gt;
## Capture has finished once the memory available flag is reset&lt;br /&gt;
&lt;br /&gt;
=== Cancel Signal Capture ===&lt;br /&gt;
&lt;br /&gt;
# Write 10 to register 0x10B4&lt;br /&gt;
# Write 0 to register 0x10B8&lt;br /&gt;
# Write 0 to register 0x10BC&lt;br /&gt;
# Write 0 to register 0x10B0&lt;br /&gt;
# Write 0 to register 0x1094 (divider bypass flag)&lt;br /&gt;
&lt;br /&gt;
After that, the memory available flag in the capture state should have been cleared. Continue in the same manner as for a regularly finished capture.&lt;br /&gt;
&lt;br /&gt;
=== Read Captured Data ===&lt;br /&gt;
&lt;br /&gt;
# Read register 0x1078: value is the number of 36-bit words in the capture buffer&lt;br /&gt;
# Write 1 to register 0x1094 (divider bypass flag)&lt;br /&gt;
# Write 2 to register 0x1074&lt;br /&gt;
# Write 4 to register 0x107C&lt;br /&gt;
# Read capture buffer:&lt;br /&gt;
## Read memory beginning at address 4 in chunks of 120 36-bit words, up to but not including 0x03FFC4&lt;br /&gt;
## Read memory beginning at address 0x03FFC4 in chunks of 8 36-bit words, up to but not including 0x03FFF4&lt;br /&gt;
# Write 0 to register 0x1094 (divider bypass flag)&lt;br /&gt;
# Issue mystery command 5 with mystery data, but for some mystical reason only for the first three captures after application start&lt;br /&gt;
&lt;br /&gt;
It does not seem to be necessary to use exactly the same read chunk length as the original vendor software. See the description of command 6 for constraints.&lt;br /&gt;
&lt;br /&gt;
The sigrok driver works fine without ever issuing mystery command 5.&lt;br /&gt;
&lt;br /&gt;
=== Shutdown ===&lt;br /&gt;
&lt;br /&gt;
1. Transfer FPGA configuration for device shutdown to EP 4&lt;/div&gt;</summary>
		<author><name>Danielk</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=Sysclk_LWLA1034/Protocol&amp;diff=11172</id>
		<title>Sysclk LWLA1034/Protocol</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=Sysclk_LWLA1034/Protocol&amp;diff=11172"/>
		<updated>2015-10-25T00:37:30Z</updated>

		<summary type="html">&lt;p&gt;Danielk: Correct assumptions about init sequence&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== FPGA Configuration ==&lt;br /&gt;
&lt;br /&gt;
The FPGA bitstream is loaded via bulk transfer to USB end point 4. Each firmware transfer starts with a 4-byte header to announce the transfer size. The payload appears to be a Raw Binary File (.rbf) with compression enabled.&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;
!Length&lt;br /&gt;
!Payload...&lt;br /&gt;
|-&lt;br /&gt;
| nnnn-nnnn&lt;br /&gt;
| dd...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Unlike the control commands, the firmware transfer is apparently byte-based. The length is a byte count encoded in big endian (1-2-3-4) byte order, and includes the size of the length field (4 bytes) itself.&lt;br /&gt;
&lt;br /&gt;
=== Application Behavior ===&lt;br /&gt;
&lt;br /&gt;
The vendor software transfers a new bitstream to the FPGA&lt;br /&gt;
# on application start,&lt;br /&gt;
# when switching clocking mode between internal, external/rising or external/falling,&lt;br /&gt;
# on application exit.&lt;br /&gt;
&lt;br /&gt;
The size of the bitstream varies due to compression, but is in the order of 50kB to 80kB. The firmware transfer is split by the vendor software into packets with 15 byte payload each and thus takes quite a bit of time inside VirtualBox. Testing with a libusb-based tool for issuing USB bulk transfers has shown that this does not appear to be necessary: Transferring even the entire firmware blob in a single bulk transfer appears to work without error.&lt;br /&gt;
=== Firmware Extraction ===&lt;br /&gt;
&lt;br /&gt;
The firmware blobs can be extracted directly from the Windows installer executable located on the CD-ROM that ships with the device.  The file &amp;lt;tt&amp;gt;lwla1034_EN_setup.exe&amp;lt;/tt&amp;gt; on the CD-ROM from 2012-07-12 has the firmware blobs located at the following offsets:&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;
!Offset&lt;br /&gt;
!Length&lt;br /&gt;
!Mode&lt;br /&gt;
|-&lt;br /&gt;
| 34110338&lt;br /&gt;
| 78398&lt;br /&gt;
| Internal clock&lt;br /&gt;
|-&lt;br /&gt;
| 34266237&lt;br /&gt;
| 78247&lt;br /&gt;
| External clock (rising edge)&lt;br /&gt;
|-&lt;br /&gt;
| 34344484&lt;br /&gt;
| 79145&lt;br /&gt;
| External clock (falling edge)&lt;br /&gt;
|-&lt;br /&gt;
| 34578631&lt;br /&gt;
| 48525&lt;br /&gt;
| Shutdown&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Both offsets and lengths are in bytes. The extracted blobs already include the header with the 32-bit length field.&lt;br /&gt;
&lt;br /&gt;
== Control Commands ==&lt;br /&gt;
&lt;br /&gt;
Control commands are sent via bulk transfer to USB end point 2, with the response (if any) coming in from end point 6.&lt;br /&gt;
&lt;br /&gt;
Command messages are sent to the device as a sequence of 16-bit words with little endian byte order. The first word in a message identifies the command type. Different command types have different message lengths. Some command types include a length field and allow for messages of variable length, others are of fixed size.&lt;br /&gt;
&lt;br /&gt;
There are read commands which trigger an immediate response from the device, and write commands without a response.&lt;br /&gt;
&lt;br /&gt;
=== Command 0001: Read Register ===&lt;br /&gt;
&lt;br /&gt;
This command reads a 32-bit wide control register.&lt;br /&gt;
&lt;br /&gt;
==== Command ====&lt;br /&gt;
&lt;br /&gt;
Fixed length of 2 words (4 bytes).&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;
!ID&lt;br /&gt;
!Address&lt;br /&gt;
|-&lt;br /&gt;
| 0001&lt;br /&gt;
| aaaa&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Response ====&lt;br /&gt;
&lt;br /&gt;
The response has a fixed length of 2 words (4 bytes). It is the content of a 32-bit register in mixed endian (2-1-4-3) byte order.&lt;br /&gt;
&lt;br /&gt;
==== Registers ====&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;
!Address&lt;br /&gt;
!Value&lt;br /&gt;
|-&lt;br /&gt;
| 10C0&lt;br /&gt;
| Channel 1 frequency counter&lt;br /&gt;
|-&lt;br /&gt;
| 10C4&lt;br /&gt;
| Channel 2 frequency counter&lt;br /&gt;
|-&lt;br /&gt;
| 10C8&lt;br /&gt;
| Channel 3 frequency counter&lt;br /&gt;
|-&lt;br /&gt;
| 10CC&lt;br /&gt;
| Channel 4 frequency counter&lt;br /&gt;
|}&lt;br /&gt;
These registers apparently count the number of rising (or falling?) clock edges on channels 1 to 4. The vendor software polls these counters every second to display a live frequency count for the first four channels.&lt;br /&gt;
&lt;br /&gt;
It is unclear what time base is being used for those counters: The large error (sometimes by more than 20%, especially for CH1) hints at I/O latency, which would imply that the software resets the counters. However, manual testing of single register reads has shown that the values do not seem to scale with the time between reads. This would mean the device is using an internal time base after all. However, that makes the large error a bit hard to explain, especially since the error is different for each channel despite being driven by the same signal source.&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;
!Address&lt;br /&gt;
!Selftest value&lt;br /&gt;
|-&lt;br /&gt;
| 10B0&lt;br /&gt;
| 12345678&lt;br /&gt;
|-&lt;br /&gt;
| 10BC&lt;br /&gt;
| 12345678&lt;br /&gt;
|-&lt;br /&gt;
| 10B8&lt;br /&gt;
| 87654321&lt;br /&gt;
|}&lt;br /&gt;
These three registers assume the values listed here after writing 100 (decimal) to register 10B4. This is apparently an identification and self-test sequence, which is performed twice in a row during initialization. After initialization, these registers are part of command sequences which initiate device operations, like capture start/stop.&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;
!Address&lt;br /&gt;
!Value&lt;br /&gt;
|-&lt;br /&gt;
| 1078&lt;br /&gt;
| Capture size (number of 36-bit words)&lt;br /&gt;
|}&lt;br /&gt;
This register holds the (compressed) size of the captured data. The vendor software retrieves this just before fetching the SRAM content.&lt;br /&gt;
&lt;br /&gt;
=== Command 0002: Write Register ===&lt;br /&gt;
&lt;br /&gt;
This command writes a 32-bit value to a control register.&lt;br /&gt;
&lt;br /&gt;
==== Command ====&lt;br /&gt;
&lt;br /&gt;
Fixed length of 4 words (8 bytes).&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;
!ID&lt;br /&gt;
!Address&lt;br /&gt;
!Data&lt;br /&gt;
|-&lt;br /&gt;
| 0002&lt;br /&gt;
| aaaa&lt;br /&gt;
| dddd-dddd&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The value is encoded in mixed endian (2-1-4-3) byte order.&lt;br /&gt;
&lt;br /&gt;
==== Registers ====&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;
!Address&lt;br /&gt;
!Init value&lt;br /&gt;
|-&lt;br /&gt;
| 10B4&lt;br /&gt;
| 00000064&lt;br /&gt;
|}&lt;br /&gt;
The vendor software writes the value 100 (decimal) to this register during initialization into order to start the self test sequence. After that, the magic register values listed in the table for command 0001 become available. So, this is kind of a command-triggering register, and there are other command codes, too.&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;
!Address&lt;br /&gt;
!Purpose&lt;br /&gt;
|-&lt;br /&gt;
| 1094&lt;br /&gt;
| Bypass clock divider&lt;br /&gt;
|-&lt;br /&gt;
| 10B4&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 10B8&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 10BC&lt;br /&gt;
| ???&lt;br /&gt;
|}&lt;br /&gt;
These are written to when a capture operation is initiated or cancelled. Register 1094 is set to 0 when using the internal clock with sampling rates of 100 MHz and below. For 125 MHz internal clock or the external clock modes, it is set to 1.&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;
!Address&lt;br /&gt;
!Init value&lt;br /&gt;
|-&lt;br /&gt;
| 1074&lt;br /&gt;
| 00000002&lt;br /&gt;
|-&lt;br /&gt;
| 107C&lt;br /&gt;
| 00000000&lt;br /&gt;
|}&lt;br /&gt;
The vendor software writes these two registers during initialization, and also when initiating a capture.&lt;br /&gt;
&lt;br /&gt;
=== Command 0005: Write ??? ===&lt;br /&gt;
&lt;br /&gt;
This command appears to write 16 32-bit words at once. The vendor software issues this after a transfer of captured data to the host has finished, but only for the first three captures. After that, the application needs to be restarted to ever see this command again.&lt;br /&gt;
&lt;br /&gt;
The data written varies each time, but it appears that only the lowest 8 bit of each 32-bit word are ever written. No idea what this might do. It could be calibration feedback or something, although it is hard to imagine how the host could help the device with that. Luckily, the sigrok driver works without ever sending this command at all.&lt;br /&gt;
&lt;br /&gt;
==== Command ====&lt;br /&gt;
&lt;br /&gt;
Fixed length of 33 words (66 bytes).&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;
!ID&lt;br /&gt;
!Data 1&lt;br /&gt;
!Data 2&lt;br /&gt;
!...&lt;br /&gt;
!Data 16&lt;br /&gt;
|-&lt;br /&gt;
| 0005&lt;br /&gt;
| dddd-dddd&lt;br /&gt;
| dddd-dddd&lt;br /&gt;
| ...&lt;br /&gt;
| dddd-dddd&lt;br /&gt;
|}&lt;br /&gt;
The byte order of each 32-bit word is most likely the usual 2-1-4-3 mixed endianess.&lt;br /&gt;
&lt;br /&gt;
==== Sample capture ====&lt;br /&gt;
&lt;br /&gt;
A sample of three such commands from an actual protocol analysis session:&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
 10185	56.455640		Cmd 5: write ??? data C3 9A 4B 91 30 D2 98 C1 CA F2 D7 4F 82 74 C0 8B&lt;br /&gt;
 14155	95.788766		Cmd 5: write ??? data E5 7B 2C F3 6B 06 76 4B 60 94 F3 EC C9 AA E9 35&lt;br /&gt;
 17823	131.101569		Cmd 5: write ??? data 16 66 EA 7B 35 F6 71 A8 0A E0 D7 E7 45 E0 4F 23&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
Only the least significant byte is shown for each 32-bit data word, as the other bytes are always 0. The message content changes with each run of the vendor software. It&amp;#039;s hard to make head or tail of this. However, as this command is issued after all captured data has been retrieved, it cannot possibly affect the preceding capture and read-out operations.&lt;br /&gt;
&lt;br /&gt;
=== Command 0006: Read Memory at Address ===&lt;br /&gt;
&lt;br /&gt;
This command reads a chunk of data from the device memory (SRAM). It allows for random access using a 32-bit start address, and for variable length via a 32-bit length field. The software uses this command to read captured data from the device&amp;#039;s buffer.&lt;br /&gt;
&lt;br /&gt;
==== Command ====&lt;br /&gt;
&lt;br /&gt;
Fixed length of 5 words (10 bytes).&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;
!ID&lt;br /&gt;
!Address&lt;br /&gt;
!Length&lt;br /&gt;
|-&lt;br /&gt;
| 0006&lt;br /&gt;
| aaaa-aaaa&lt;br /&gt;
| nnnn-nnnn&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Both the address and the length are encoded in mixed endian (2-1-4-3) byte order.&lt;br /&gt;
&lt;br /&gt;
==== Response ====&lt;br /&gt;
&lt;br /&gt;
The memory is 36 bit wide, and thus the size of the response in bits is 36 times the value in the length field. The original vendor software reads chunks of 120 words @ 36 bit at a time, which works out to an integer multiple of 32 (i.e. 4320 bits = 135 32-bit words or 540 bytes). The final six reads are done in chunks of 8 words @ 36 bit, which works out to nine 32-bit words or 36 bytes. The overall amount of memory being read when fetching captured samples from a full buffer is just below the RAM size of 256k×36 bit.&lt;br /&gt;
&lt;br /&gt;
Note that the software always starts reading at address 4 rather than 0. Presumably, the firmware uses the first four 36-bit words for internal bookkeeping or some other purpose. Exception to the rule: For some unknown reason (perhaps testing), the memory is also being read on start-up right after loading the firmware into the FPGA. In this case, altogether 128000 36-bit words are being read beginning at address 0.&lt;br /&gt;
&lt;br /&gt;
Note that reading more than 1024 bytes at a time seems to be unreliable. Due to the constraints outlined in the following section, the maximum read length should therefore be restricted to 224 device words, which works out to 1008 bytes.&lt;br /&gt;
&lt;br /&gt;
===== 36-to-32 Bit Mapping =====&lt;br /&gt;
&lt;br /&gt;
The data returned by the read command consists of 32-bit words in 2-1-4-3 mixed endian byte order. Eight consecutive 36-bit words from the SRAM are mapped at a time to nine consecutive 32-bit words in the received stream. The first of these slices aligns to the beginning of the read-out stream, apparently irrespective of the absolute start address of the read operation.&lt;br /&gt;
&lt;br /&gt;
The first eight 32-bit words in a slice contain the lower 32 bit of the eight encoded 36-bit words. The ninth 32-bit word contains the four remaining high bits of all eight 36-bit words combined. The high nibbles are shifted into the ninth word from right to left, resulting in a 1-2-3-4-5-6-7-8 order of nibbles. (This is after conversion from mixed endian byte order!)&lt;br /&gt;
&lt;br /&gt;
As it is necessary to access the ninth 32-bit word in each slice even to fully extract the first 36-bit word, it follows that memory reads should always request a multiple of the slice length, i.e. eight 36-bit words. The length of the response will thus always be a multiple of nine 32-bit words (36 bytes). However, it does not appear to be necessary to restrict read operations to only the two lengths 120 and 8 used by the vendor software.&lt;br /&gt;
&lt;br /&gt;
===== Compression Scheme =====&lt;br /&gt;
&lt;br /&gt;
The compression scheme is a form of run-length encoding. Very short run lengths of only one or two cycles are handled as special cases, which helps to keep the worst-case overhead of compression pretty low. In particular, the scheme ensures that it is never necessary to write more than one 36-bit word per sampling cycle to the SRAM buffer.&lt;br /&gt;
&lt;br /&gt;
Each 36-bit word in the stream is either a data word or a repeat half-count word. The first word in the stream is a data word, with the following layout:&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;
!Bit&lt;br /&gt;
!35&lt;br /&gt;
!34&lt;br /&gt;
!33&lt;br /&gt;
!32&lt;br /&gt;
!31&lt;br /&gt;
!...&lt;br /&gt;
!2&lt;br /&gt;
!1&lt;br /&gt;
!0&lt;br /&gt;
|-&lt;br /&gt;
!Meaning&lt;br /&gt;
| Repeat count follows&lt;br /&gt;
| LSB of repeat count&lt;br /&gt;
| CH34&lt;br /&gt;
| CH33&lt;br /&gt;
| CH32&lt;br /&gt;
| ...&lt;br /&gt;
| CH3&lt;br /&gt;
| CH2&lt;br /&gt;
| CH1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
If bit 35 is set, then the next 36-bit word in the stream encodes the number of cycles the previous data word is repeated, divided by two. The actual number of repeat cycles is twice that number plus the LSB of repeat count, i.e. bit 34 from the data word. If bit 35 is not set the next word is again a data word and the repeat half-count is assumed as zero. However, the LSB of repeat count bit still applies; i.e. if it is set then the repeat count would be 1.&lt;br /&gt;
&lt;br /&gt;
So, to recap, repeat counts 0 to 1 are encoded as part of the channel data word, larger repeat counts use up a full extra 36-bit word. The combined repeat count is then 37 bit wide. At 125 MHz, this scheme would allow for encoding run lengths of more than 18 minutes. However, note that the vendor software does not actually make use of the full range: Apparently, it stops as soon as the count rolls over into bit 36, thereby cutting the maximum possible run length in half (i.e. about 9 minutes at 125 MHz). However, this detail does not make any difference for the decompression algorithm.&lt;br /&gt;
&lt;br /&gt;
The next word following a repeat half-count is again a data word. Note that it is possible for a sample/run-length pair to be split across a slice boundary, or even across successive read chunks. The decoder therefore needs to keep track of RLE state across slices as well as read operations.&lt;br /&gt;
&lt;br /&gt;
=== Command 0007: Capture Setup ===&lt;br /&gt;
&lt;br /&gt;
This command prepares a capture operation. Essentially, this command appears to write to an internal memory block with 64-bit granularity. Command 0008 can be used to read from the same memory.&lt;br /&gt;
&lt;br /&gt;
The vendor software issues this command once during start-up, and once for each capture operation as part of the setup sequence. It is also issued when clicking the Stop button to cancel a capture in progress.&lt;br /&gt;
&lt;br /&gt;
==== Command ====&lt;br /&gt;
&lt;br /&gt;
Variable length of 3 words (6 bytes) plus length × 4 words (8 bytes).&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;
!ID&lt;br /&gt;
!Address&lt;br /&gt;
!Length&lt;br /&gt;
!Data&lt;br /&gt;
!...&lt;br /&gt;
|-&lt;br /&gt;
| 0007&lt;br /&gt;
| aaaa&lt;br /&gt;
| nnnn&lt;br /&gt;
| dddd-dddd-dddd-dddd&lt;br /&gt;
| ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The two argument words are the start address and the length of the slice to write, in little endian byte order. Both the address and the length refer to quantities of 64 bit (4 words or 8 bytes). Thus, if length is 10 the payload should consist of 40 words or 80 bytes.&lt;br /&gt;
&lt;br /&gt;
The vendor software always writes a slice of length 10 beginning at address 0, thus completely resetting both the capture configuration as well as the capture status. The layout of the configuration and status memory is outlined in the description of command 0008.&lt;br /&gt;
&lt;br /&gt;
=== Command 0008: Capture Status ===&lt;br /&gt;
&lt;br /&gt;
This command reads the current capture configuration and status. Essentially, this command appears to read a slice from an internal memory block with 64-bit granularity -- the same memory space command 7 writes to. During idle periods, the software polls the channel state about 34 times per second for its live port status display. During a capture operation, it is necessary to poll the status in order to find out whether the capture buffer has been filled completely and samples can be retrieved.&lt;br /&gt;
&lt;br /&gt;
==== Command ====&lt;br /&gt;
&lt;br /&gt;
Fixed length of 3 words (6 bytes).&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;
!ID&lt;br /&gt;
!Address&lt;br /&gt;
!Length&lt;br /&gt;
|-&lt;br /&gt;
| 0008&lt;br /&gt;
| aaaa&lt;br /&gt;
| nnnn&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The two argument words are the start address and the length of the slice to read, in little endian byte order. Both the address and the length refer to quantities of 64 bit (4 words or 8 bytes). Thus, if length is 10 the reply will consist of 40 words or 80 bytes.&lt;br /&gt;
&lt;br /&gt;
Although the vendor software always reads the full 10 fields of configuration and status information, it does not seem to be an actual requirement. Restricting reads to fields 5 to 9 in the sigrok driver works fine so far without any problems.&lt;br /&gt;
&lt;br /&gt;
==== Response ====&lt;br /&gt;
&lt;br /&gt;
The table below shows the response to the command as issued by the vendor software, i.e. with start address 0 and length 10. Each row is a 64-bit word in very much mixed up (6-5-8-7-2-1-4-3) byte order. Roughly, the first half is used to set up a capture operation, whereas the second half contains status information. Field 5 is an exception, as it is used for both setup and status.&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;
!Index&lt;br /&gt;
!Byte offset&lt;br /&gt;
!Value&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 00&lt;br /&gt;
| Channel enable mask&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 08&lt;br /&gt;
| Clock divider count&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 10&lt;br /&gt;
| Trigger level mask&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| 18&lt;br /&gt;
| Trigger edge mask&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 20&lt;br /&gt;
| Trigger enable mask&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| 28&lt;br /&gt;
| Capture memory fill level&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| 30&lt;br /&gt;
| Not used?&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| 38&lt;br /&gt;
| Running capture duration&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 40&lt;br /&gt;
| Channel input state&lt;br /&gt;
|-&lt;br /&gt;
| 9&lt;br /&gt;
| 48&lt;br /&gt;
| Capture status flags&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The channel enable mask and the input state are bit vectors, with bit 0 of the 64-bit word (after unmixing the byte order!) corresponding to CH1 and bit 33 corresponding to CH34. The enable mask shows which channels have been enabled for capturing. The bits in the input state vector signify whether the voltage at the corresponding input channels is currently low (0) or high (1).&lt;br /&gt;
&lt;br /&gt;
Field 1 sets the max value of the counter which divides the internal clock to yield the sampling clock. This applies to all sample rates of 100MHz or less (125MHz is a special case: see control register 1094). The counter max value is calculated as follows: maxcount = 1 / (samplefreq * 10ns) - 1&lt;br /&gt;
&lt;br /&gt;
Field 4 is the trigger enable mask. 1 enables triggering on a channel, 0 disables it. CH1 is mapped to bit 0 and CH34 to bit 33. Bits 34 and 35 are special and configure for external triggering. Bit 34 enables external triggering on the falling edge, bit 35 on the rising edge.&lt;br /&gt;
&lt;br /&gt;
If a trigger channel is enabled, the corresponding bit in field 3 configures whether to trigger on level (0) or edge (1). The corresponding bit in field 2 then selects whether to trigger on low/falling (0) or high/rising (1).&lt;br /&gt;
&lt;br /&gt;
During setup, field 5 is used to limit the (compressed) size of the captured data. During a running capture operation, field 5 indicates the current memory fill level.&lt;br /&gt;
&lt;br /&gt;
Field 7 is the time passed since the first sample. For samplerates up to 100 MHz, the value is a duration in milliseconds. The 125 MHz setting is again special and uses the same timebase as the 100 MHz setting, i.e. field 7 can then be interpreted as the sample count × 10&amp;lt;sup&amp;gt;−5&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Field 8 records a snapshot of the signal level of all 34 channels at the time the status is being read.&lt;br /&gt;
&lt;br /&gt;
Field 6 appears to be unused.&lt;br /&gt;
&lt;br /&gt;
===== Capture Status Flags =====&lt;br /&gt;
&lt;br /&gt;
The status flag bits are used as follows:&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;
!Bit 0&lt;br /&gt;
!Bit 1&lt;br /&gt;
!Bit 2&lt;br /&gt;
!Bit 3&lt;br /&gt;
!Bit 4&lt;br /&gt;
!Bit 5&lt;br /&gt;
|-&lt;br /&gt;
| ???&lt;br /&gt;
| Capturing&lt;br /&gt;
| ???&lt;br /&gt;
| ???&lt;br /&gt;
| Triggered&lt;br /&gt;
| Memory available&lt;br /&gt;
|}&lt;br /&gt;
The higher bits of field 9 appear to contain garbage (apparently copies of the bits from field 8).&lt;br /&gt;
&lt;br /&gt;
== Task Recipes ==&lt;br /&gt;
&lt;br /&gt;
This section lists the commands issued by the software to perform a particular task.&lt;br /&gt;
&lt;br /&gt;
=== Initialization ===&lt;br /&gt;
&lt;br /&gt;
# Acquire control of USB device and select configuration 1&lt;br /&gt;
# Send FPGA bitstream (default: internal clock) to EP 4 via bulk transfer&lt;br /&gt;
# Device test sequence (performed twice by vendor software, only the results of the second run should be checked):&lt;br /&gt;
## Write 100 to register 0x10B4&lt;br /&gt;
## Read register 0x10B0: value should be ignored&lt;br /&gt;
## Read register 0x10BC: value should be 0x12345678&lt;br /&gt;
## Read register 0x10B8: value should be 0x87654321&lt;br /&gt;
# Capture setup/state test (vendor software does this, not mandatory):&lt;br /&gt;
## Write sequence 0..9 to capture setup fields (via command 7)&lt;br /&gt;
## Read back capture state (via command 8): 0..4 should be read back as is, 5..9 are trashed anyway&lt;br /&gt;
# Memory test (vendor software does this, not mandatory):&lt;br /&gt;
## Write 2 to register 0x1074&lt;br /&gt;
## Write 0 to register 0x107C&lt;br /&gt;
## Read memory beginning at address 0 in chunks of 120 36-bit words, up to but not including 0x013FB0&lt;br /&gt;
## Read memory beginning at address 0x013FB0 in chunks of 8 36-bit words, up to but not including 0x014000&lt;br /&gt;
&lt;br /&gt;
It does not seem to be necessary to use exactly the same read chunk length as the original vendor software. See the description of command 6 for constraints.&lt;br /&gt;
&lt;br /&gt;
=== Poll channel state ===&lt;br /&gt;
&lt;br /&gt;
The vendor software continuously polls the channel state even when idle. However, it is not mandatory to do so.&lt;br /&gt;
&lt;br /&gt;
# Poll frequency of signal at CH1 to CH4:&lt;br /&gt;
## Read register 0x10C0: value is frequency of CH1 signal&lt;br /&gt;
## Read register 0x10C4: value is frequency of CH2 signal&lt;br /&gt;
## Read register 0x10C8: value is frequency of CH3 signal&lt;br /&gt;
## Read register 0x10CC: value is frequency of CH4 signal&lt;br /&gt;
# Poll signal level of all channels:&lt;br /&gt;
## Read capture state (via command 8): the signal level of all channels is recorded in field 8&lt;br /&gt;
&lt;br /&gt;
=== Clocking Mode Switch ===&lt;br /&gt;
&lt;br /&gt;
# Transfer one of three FPGA bitstreams to EP 4:&lt;br /&gt;
## Configuration for internal clock&lt;br /&gt;
## Configuration for external clock, rising edge&lt;br /&gt;
## Configuration for external clock, falling edge&lt;br /&gt;
&lt;br /&gt;
=== Signal Capture ===&lt;br /&gt;
&lt;br /&gt;
# Write 2 to register 0x1074&lt;br /&gt;
# Write 1 to register 0x1074 (previous write may be redundant, needs testing)&lt;br /&gt;
# Write 10 to register 0x10B4&lt;br /&gt;
# Write 0x74 to register 0x10B8&lt;br /&gt;
# Write 0 to register 0x10BC&lt;br /&gt;
# Write 0 to register 0x10B0&lt;br /&gt;
# Write divider bypass flag to register 0x1094 (see description of register)&lt;br /&gt;
# Write capture setup (command 7, address 0, length 10: see description of command)&lt;br /&gt;
# Write 10 to register 0x10B4&lt;br /&gt;
# Write 1 to register 0x10B8&lt;br /&gt;
# Write 0 to register 0x10BC&lt;br /&gt;
# Write 0 to register 0x10B0&lt;br /&gt;
# Wait for capture to finish:&lt;br /&gt;
## Poll capture state (command 8, address 0, length 10: see description of command)&lt;br /&gt;
## Report progress information (got trigger, cycles elapsed, memory fill percentage) to user&lt;br /&gt;
## Capture has finished once the memory available flag is reset&lt;br /&gt;
&lt;br /&gt;
=== Cancel Signal Capture ===&lt;br /&gt;
&lt;br /&gt;
# Write 10 to register 0x10B4&lt;br /&gt;
# Write 0 to register 0x10B8&lt;br /&gt;
# Write 0 to register 0x10BC&lt;br /&gt;
# Write 0 to register 0x10B0&lt;br /&gt;
# Write 0 to register 0x1094 (divider bypass flag)&lt;br /&gt;
&lt;br /&gt;
After that, the memory available flag in the capture state should have been cleared. Continue in the same manner as for a regularly finished capture.&lt;br /&gt;
&lt;br /&gt;
=== Read Captured Data ===&lt;br /&gt;
&lt;br /&gt;
# Read register 0x1078: value is the number of 36-bit words in the capture buffer&lt;br /&gt;
# Write 1 to register 0x1094 (divider bypass flag)&lt;br /&gt;
# Write 2 to register 0x1074&lt;br /&gt;
# Write 4 to register 0x107C&lt;br /&gt;
# Read capture buffer:&lt;br /&gt;
## Read memory beginning at address 4 in chunks of 120 36-bit words, up to but not including 0x03FFC4&lt;br /&gt;
## Read memory beginning at address 0x03FFC4 in chunks of 8 36-bit words, up to but not including 0x03FFF4&lt;br /&gt;
# Write 0 to register 0x1094 (divider bypass flag)&lt;br /&gt;
# Issue mystery command 5 with mystery data, but for some mystical reason only for the first three captures after application start&lt;br /&gt;
&lt;br /&gt;
It does not seem to be necessary to use exactly the same read chunk length as the original vendor software. See the description of command 6 for constraints.&lt;br /&gt;
&lt;br /&gt;
The sigrok driver works fine without ever issuing mystery command 5.&lt;br /&gt;
&lt;br /&gt;
=== Shutdown ===&lt;br /&gt;
&lt;br /&gt;
1. Transfer FPGA configuration for device shutdown to EP 4&lt;/div&gt;</summary>
		<author><name>Danielk</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=Sysclk_LWLA1016/Protocol&amp;diff=10892</id>
		<title>Sysclk LWLA1016/Protocol</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=Sysclk_LWLA1016/Protocol&amp;diff=10892"/>
		<updated>2015-07-06T12:29:35Z</updated>

		<summary type="html">&lt;p&gt;Danielk: Correct description of command 3&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The basic structure of the SysClk LWLA1016 protocol is similar to the [[Sysclk LWLA1034/Protocol]]. As one would expect, it looks very much like an earlier iteration of the LWLA1034 protocol. It appears to lack the specialized commands the LWLA1034 has for reading memory and capture setup/status. Most of the functionality seems to be implemented on top of basic register reads and writes, using the same commands as the LWLA1034 for those.&lt;br /&gt;
&lt;br /&gt;
== FPGA Configuration ==&lt;br /&gt;
&lt;br /&gt;
As with the LWLA1034, the FPGA bitstream is loaded via bulk transfer to USB end point 4. The format seems to be exactly the same, too.&lt;br /&gt;
&lt;br /&gt;
The Windows software ships four separate executables: One for running with 16 channels at up to 100 MSps, one for 8 channels at up to 200 MSps, and one for 8 channels at 250 MSps. A fourth executable runs the LWLA1016 in frequency counter mode. Each of the executables downloads its own bitstream to the FPGA.&lt;br /&gt;
&lt;br /&gt;
=== Application Behavior ===&lt;br /&gt;
&lt;br /&gt;
The vendor software transfers a new bitstream to the FPGA&lt;br /&gt;
# on application start,&lt;br /&gt;
# ... (TODO).&lt;br /&gt;
&lt;br /&gt;
Selecting specific device configurations may require downloading other bitstream variants to the device. TODO: Make sure all modes are covered.&lt;br /&gt;
&lt;br /&gt;
=== Firmware Extraction ===&lt;br /&gt;
&lt;br /&gt;
The FPGA bitstreams are stored in RBF (Raw Binary File) format, as with the LWLA1034. The bitstreams can be extracted from various DLLs installed with the Windows software (an extraction tool will be provided until we get permission to distribute the firmware). Unfortunately, unlike with the LWLA1034, the LWLA1016 firmware cannot be easily extracted from the installer executable without installing the software first.&lt;br /&gt;
&lt;br /&gt;
There are six different FPGA bitstreams for the various LA modes: 3 frequency modes times 2 compression modes. In the vendor&amp;#039;s terminology, &amp;quot;Timing-State&amp;quot; is the mode with compression enabled and &amp;quot;Normal&amp;quot; is the mode without compression.&lt;br /&gt;
&lt;br /&gt;
== Control Commands ==&lt;br /&gt;
&lt;br /&gt;
As with the LWLA1034, control commands are sent via bulk transfer to USB end point 2, with the response (if any) coming in from end point 6.&lt;br /&gt;
&lt;br /&gt;
For the most part, the LWLA1016 protocol seems to consist of basic register read and write commands. Unlike with the LWLA1034, it looks like capture setup, capture status polling and reading from memory are implemented on top of simple register reads and writes.&lt;br /&gt;
&lt;br /&gt;
=== Command 0001: Read Register ===&lt;br /&gt;
&lt;br /&gt;
Apparently identical to command 1 in the LWLA1034 protocol.&lt;br /&gt;
&lt;br /&gt;
==== Registers ====&lt;br /&gt;
&lt;br /&gt;
Some of the register addresses appearing in the protocol also occur in the LWLA1034 protocol, although it seems that their purpose may not be the same. Other registers appear to be specific to the LWLA1016.&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;
!Address&lt;br /&gt;
!Value&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
| 1010&lt;br /&gt;
| ???&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 1070&lt;br /&gt;
| ???&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 107C&lt;br /&gt;
| ???&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 10B0&lt;br /&gt;
| ???&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 10B4&lt;br /&gt;
| ???&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 10B8&lt;br /&gt;
| ???&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 10BC&lt;br /&gt;
| 0x1234xxxx&lt;br /&gt;
| The lower 16 bit appear to be the live channel state&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Command 0002: Write Register ===&lt;br /&gt;
&lt;br /&gt;
Apparently identical to command 2 in the LWLA1034 protocol.&lt;br /&gt;
&lt;br /&gt;
==== Registers ====&lt;br /&gt;
&lt;br /&gt;
Some of the register addresses appearing in the protocol also occur in the LWLA1034 protocol, although it seems that their purpose may not be the same. Other registers appear to be specific to the LWLA1016.&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;
!Address&lt;br /&gt;
!Value&lt;br /&gt;
|-&lt;br /&gt;
| 1000&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 1010&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 107C&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 10B0&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 10B4&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 10B8&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 10BC&lt;br /&gt;
| ???&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Command 0003: Read Memory at Address ===&lt;br /&gt;
&lt;br /&gt;
This command reads the captured samples from the device. It works very much like command 6 in the LWLA1034 protocol.&lt;br /&gt;
&lt;br /&gt;
==== Command ====&lt;br /&gt;
&lt;br /&gt;
Fixed length of 5 words (10 bytes).&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;
!ID&lt;br /&gt;
!Address&lt;br /&gt;
!Length&lt;br /&gt;
|-&lt;br /&gt;
| 0003&lt;br /&gt;
| aaaa-aaaa&lt;br /&gt;
| nnnn-nnnn&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Both the address and the length are encoded in mixed endian (2-1-4-3) byte order.&lt;br /&gt;
&lt;br /&gt;
==== Response ====&lt;br /&gt;
&lt;br /&gt;
The memory is 32 bit wide, and thus the size of the response in bits is 32 times the value in the length field. The original vendor software reads chunks of 250 words @ 32 bit at a time, i.e. 1000 bytes. Note that the software always starts reading at address 2 rather than 0.&lt;br /&gt;
&lt;br /&gt;
===== Compression Scheme =====&lt;br /&gt;
&lt;br /&gt;
In timing-state mode a very simple form of run-length encoding is used. Each 32-bit unit of memory holds 2 Little Endian values. The 16-bit word  at the lower address is the repeat count for the channel state encoded in the subsequent 16-bit word.&lt;br /&gt;
&lt;br /&gt;
=== Command 0005: Write ??? ===&lt;br /&gt;
&lt;br /&gt;
This command appears to have the same format and function as command 5 sent by the original LWLA1034 firmware. That means we can probably ignore it, just as with the LWLA1034.&lt;br /&gt;
&lt;br /&gt;
==== Command ====&lt;br /&gt;
&lt;br /&gt;
Fixed length of 33 words (66 bytes).&lt;br /&gt;
&lt;br /&gt;
== Task Recipes ==&lt;br /&gt;
&lt;br /&gt;
This section lists the commands issued by the software to perform a particular task.&lt;br /&gt;
&lt;br /&gt;
=== Initialization ===&lt;br /&gt;
&lt;br /&gt;
# Acquire control of USB device and select configuration 1&lt;br /&gt;
# Send FPGA bitstream to EP 4 via bulk transfer&lt;br /&gt;
# Initial register activity:&lt;br /&gt;
## Read register 0x10B4, expected reply is 0x12345678&lt;br /&gt;
## Read register 0x10B4 (again), expected reply is 0x12345678&lt;br /&gt;
## Send command 5, which seems to have the same format and payload as with the LWLA1034&lt;br /&gt;
&lt;br /&gt;
=== Device State Polling ===&lt;br /&gt;
&lt;br /&gt;
# Read register 0x10B8, reply is 0x10 in timing-state mode, or 0 in normal mode&lt;br /&gt;
# Read register 0x10B0, reply is 0&lt;br /&gt;
# Read register 0x1070, reply is 0&lt;br /&gt;
# Read register 0x10BC, reply is 0x1234xxxx, where &amp;quot;xxxx&amp;quot; is the channel state&lt;br /&gt;
# Read register 0x1010, reply is 0&lt;/div&gt;</summary>
		<author><name>Danielk</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=Sysclk_LWLA1016&amp;diff=10891</id>
		<title>Sysclk LWLA1016</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=Sysclk_LWLA1016&amp;diff=10891"/>
		<updated>2015-07-06T09:22:21Z</updated>

		<summary type="html">&lt;p&gt;Danielk: Add more detail&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox logic analyzer&lt;br /&gt;
| image            = [[File:Sysclk lwla1016.png|180px]]&lt;br /&gt;
| name             = Sysclk LWLA1016&lt;br /&gt;
| status           = in progress&lt;br /&gt;
| source_code_dir  = &lt;br /&gt;
| channels         = 16/8&lt;br /&gt;
| samplerate       = 100/200/250 MHz&lt;br /&gt;
| samplerate_state = ?&lt;br /&gt;
| triggers         = only in 100MHz mode&lt;br /&gt;
| voltages         = ?&lt;br /&gt;
| threshold        = ?&lt;br /&gt;
| memory           = 256Kbit/channel&lt;br /&gt;
| compression      = optional&lt;br /&gt;
| website          = [http://item.taobao.com/item.htm?id=12821371102 taobao.com]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
The &amp;#039;&amp;#039;&amp;#039;Sysclk LWLA1016&amp;#039;&amp;#039;&amp;#039; is a USB-based, 16-channel logic analyzer with up to 100MHz sampling rate, or up to 250MHz with 8 channels.&lt;br /&gt;
&lt;br /&gt;
See [[Sysclk LWLA1016/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;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
== Photos ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Sysclk lwla1016 front.jpg|&amp;lt;small&amp;gt;Device, front&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Sysclk lwla1016 device back.jpg|&amp;lt;small&amp;gt;Device, back&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Sysclk lwla1016 device open.jpg|&amp;lt;small&amp;gt;Device, open&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Sysclk lwla1016 pcb top.jpg|&amp;lt;small&amp;gt;PCB, top&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Sysclk lwla1016 pcb bottom.jpg|&amp;lt;small&amp;gt;PCB, bottom&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Sysclk lwla1016 pcb cypress fx2.jpg|&amp;lt;small&amp;gt;Cypress FX2&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Sysclk lwla1016 pcb issi 1.jpg|&amp;lt;small&amp;gt;ISSI 1&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Sysclk lwla1016 pcb issi2.jpg|&amp;lt;small&amp;gt;ISSI 2&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Sysclk lwla1016 pcb atmlh105.jpg|&amp;lt;small&amp;gt;ATMLH105&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Sysclk lwla1016 stc 15f104e.jpg|&amp;lt;small&amp;gt;STC&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Sysclk lwla1016 pcb ldo.jpg|&amp;lt;small&amp;gt;LDOs&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Sysclk lwla1016 pcb input.jpg|&amp;lt;small&amp;gt;Input stage&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Sysclk lwla1016 pcb crystal.jpg|&amp;lt;small&amp;gt;Crystal&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Protocol ==&lt;br /&gt;
&lt;br /&gt;
Reverse engineering of the vendor&amp;#039;s custom protocol has begun. See [[Sysclk LWLA1016/Protocol]] for the findings gathered so far.&lt;br /&gt;
&lt;br /&gt;
== Resources ==&lt;br /&gt;
&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
[[Category:Device]]&lt;br /&gt;
[[Category:Logic analyzer]]&lt;br /&gt;
[[Category:In progress]]&lt;/div&gt;</summary>
		<author><name>Danielk</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=Sysclk_LWLA1016&amp;diff=10890</id>
		<title>Sysclk LWLA1016</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=Sysclk_LWLA1016&amp;diff=10890"/>
		<updated>2015-07-05T22:55:47Z</updated>

		<summary type="html">&lt;p&gt;Danielk: Also change category&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox logic analyzer&lt;br /&gt;
| image            = [[File:Sysclk lwla1016.png|180px]]&lt;br /&gt;
| name             = Sysclk LWLA1016&lt;br /&gt;
| status           = in progress&lt;br /&gt;
| source_code_dir  = &lt;br /&gt;
| channels         = 16&lt;br /&gt;
| samplerate       = 100MHz&lt;br /&gt;
| samplerate_state = ?&lt;br /&gt;
| triggers         = ?&lt;br /&gt;
| voltages         = ?&lt;br /&gt;
| threshold        = ?&lt;br /&gt;
| memory           = 256Kbit/channel&lt;br /&gt;
| compression      = ?&lt;br /&gt;
| website          = [http://item.taobao.com/item.htm?id=12821371102 taobao.com]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
The &amp;#039;&amp;#039;&amp;#039;Sysclk LWLA1016&amp;#039;&amp;#039;&amp;#039; is a USB-based, 16-channel logic analyzer with up to 100MHz sampling rate, or up to 250MHz with 8 channels.&lt;br /&gt;
&lt;br /&gt;
See [[Sysclk LWLA1016/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;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
== Photos ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Sysclk lwla1016 front.jpg|&amp;lt;small&amp;gt;Device, front&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Sysclk lwla1016 device back.jpg|&amp;lt;small&amp;gt;Device, back&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Sysclk lwla1016 device open.jpg|&amp;lt;small&amp;gt;Device, open&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Sysclk lwla1016 pcb top.jpg|&amp;lt;small&amp;gt;PCB, top&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Sysclk lwla1016 pcb bottom.jpg|&amp;lt;small&amp;gt;PCB, bottom&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Sysclk lwla1016 pcb cypress fx2.jpg|&amp;lt;small&amp;gt;Cypress FX2&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Sysclk lwla1016 pcb issi 1.jpg|&amp;lt;small&amp;gt;ISSI 1&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Sysclk lwla1016 pcb issi2.jpg|&amp;lt;small&amp;gt;ISSI 2&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Sysclk lwla1016 pcb atmlh105.jpg|&amp;lt;small&amp;gt;ATMLH105&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Sysclk lwla1016 stc 15f104e.jpg|&amp;lt;small&amp;gt;STC&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Sysclk lwla1016 pcb ldo.jpg|&amp;lt;small&amp;gt;LDOs&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Sysclk lwla1016 pcb input.jpg|&amp;lt;small&amp;gt;Input stage&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Sysclk lwla1016 pcb crystal.jpg|&amp;lt;small&amp;gt;Crystal&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Protocol ==&lt;br /&gt;
&lt;br /&gt;
Reverse engineering of the vendor&amp;#039;s custom protocol has begun. See [[Sysclk LWLA1016/Protocol]] for the findings gathered so far.&lt;br /&gt;
&lt;br /&gt;
== Resources ==&lt;br /&gt;
&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
[[Category:Device]]&lt;br /&gt;
[[Category:Logic analyzer]]&lt;br /&gt;
[[Category:In progress]]&lt;/div&gt;</summary>
		<author><name>Danielk</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=Sysclk_LWLA1016&amp;diff=10889</id>
		<title>Sysclk LWLA1016</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=Sysclk_LWLA1016&amp;diff=10889"/>
		<updated>2015-07-05T22:54:00Z</updated>

		<summary type="html">&lt;p&gt;Danielk: Elevate state to &amp;quot;in progress&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox logic analyzer&lt;br /&gt;
| image            = [[File:Sysclk lwla1016.png|180px]]&lt;br /&gt;
| name             = Sysclk LWLA1016&lt;br /&gt;
| status           = in progress&lt;br /&gt;
| source_code_dir  = &lt;br /&gt;
| channels         = 16&lt;br /&gt;
| samplerate       = 100MHz&lt;br /&gt;
| samplerate_state = ?&lt;br /&gt;
| triggers         = ?&lt;br /&gt;
| voltages         = ?&lt;br /&gt;
| threshold        = ?&lt;br /&gt;
| memory           = 256Kbit/channel&lt;br /&gt;
| compression      = ?&lt;br /&gt;
| website          = [http://item.taobao.com/item.htm?id=12821371102 taobao.com]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
The &amp;#039;&amp;#039;&amp;#039;Sysclk LWLA1016&amp;#039;&amp;#039;&amp;#039; is a USB-based, 16-channel logic analyzer with up to 100MHz sampling rate, or up to 250MHz with 8 channels.&lt;br /&gt;
&lt;br /&gt;
See [[Sysclk LWLA1016/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;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
== Photos ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Sysclk lwla1016 front.jpg|&amp;lt;small&amp;gt;Device, front&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Sysclk lwla1016 device back.jpg|&amp;lt;small&amp;gt;Device, back&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Sysclk lwla1016 device open.jpg|&amp;lt;small&amp;gt;Device, open&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Sysclk lwla1016 pcb top.jpg|&amp;lt;small&amp;gt;PCB, top&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Sysclk lwla1016 pcb bottom.jpg|&amp;lt;small&amp;gt;PCB, bottom&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Sysclk lwla1016 pcb cypress fx2.jpg|&amp;lt;small&amp;gt;Cypress FX2&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Sysclk lwla1016 pcb issi 1.jpg|&amp;lt;small&amp;gt;ISSI 1&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Sysclk lwla1016 pcb issi2.jpg|&amp;lt;small&amp;gt;ISSI 2&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Sysclk lwla1016 pcb atmlh105.jpg|&amp;lt;small&amp;gt;ATMLH105&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Sysclk lwla1016 stc 15f104e.jpg|&amp;lt;small&amp;gt;STC&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Sysclk lwla1016 pcb ldo.jpg|&amp;lt;small&amp;gt;LDOs&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Sysclk lwla1016 pcb input.jpg|&amp;lt;small&amp;gt;Input stage&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Sysclk lwla1016 pcb crystal.jpg|&amp;lt;small&amp;gt;Crystal&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Protocol ==&lt;br /&gt;
&lt;br /&gt;
Reverse engineering of the vendor&amp;#039;s custom protocol has begun. See [[Sysclk LWLA1016/Protocol]] for the findings gathered so far.&lt;br /&gt;
&lt;br /&gt;
== Resources ==&lt;br /&gt;
&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
[[Category:Device]]&lt;br /&gt;
[[Category:Logic analyzer]]&lt;br /&gt;
[[Category:Planned]]&lt;/div&gt;</summary>
		<author><name>Danielk</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=Supported_hardware&amp;diff=10888</id>
		<title>Supported hardware</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=Supported_hardware&amp;diff=10888"/>
		<updated>2015-07-05T22:51:56Z</updated>

		<summary type="html">&lt;p&gt;Danielk: LWLA1016 support is now in progress&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;sigrok is intended as a flexible, cross-platform, and &amp;#039;&amp;#039;&amp;#039;hardware-independent&amp;#039;&amp;#039;&amp;#039; software suite, i.e., it supports various devices from many different vendors.&lt;br /&gt;
&lt;br /&gt;
Here is a list of currently supported devices (various stages of completeness) and devices we plan to support in the near future.&lt;br /&gt;
&lt;br /&gt;
The lists are sorted by category ([[File:Nuvola OK.png|16px]] &amp;lt;span style=&amp;quot;background-color: lime&amp;quot;&amp;gt;supported&amp;lt;/span&amp;gt;: [[:Category:Supported|{{PAGESINCATEGORY:Supported|pages}}]], [[File:Nuvola Orange.png|16px]] &amp;lt;span style=&amp;quot;background-color: orange&amp;quot;&amp;gt;in progress&amp;lt;/span&amp;gt;: [[:Category:In progress|{{PAGESINCATEGORY:In progress|pages}}]], [[File:Nuvola Red.png|16px]] &amp;lt;span style=&amp;quot;background-color: red&amp;quot;&amp;gt;planned&amp;lt;/span&amp;gt;: [[:Category:Planned|{{PAGESINCATEGORY:Planned|pages}}]]), and alphabetically within those categories.&lt;br /&gt;
&lt;br /&gt;
== Logic analyzers ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;100px&amp;quot; heights=&amp;quot;100px&amp;quot;&amp;gt;&lt;br /&gt;
File:ARMFLY MINI LOGIC.png|link=ARMFLY Mini-Logic|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[ARMFLY Mini-Logic]] (8ch, 24MHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:ASIX SIGMA 2.png|link=ASIX SIGMA|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[ASIX SIGMA]] (16ch, 200MHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Braintechnology_usb_interface_v26.png|link=Braintechnology USB Interface V2.x|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Braintechnology USB Interface V2.x]] (8/16ch, 24/12MHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Braintechnology_usb_lps.png|link=Braintechnology USB-LPS|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Braintechnology USB-LPS]] (8/16ch, 24/12MHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Chronovu la8 front.png|link=ChronoVu LA8|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[ChronoVu LA8]] (8ch, 100MHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Chronovu la16.png|link=ChronoVu LA16|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[ChronoVu LA16]] (16ch, 200MHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Cwav_usbee_sx.png|link=CWAV USBee SX|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[CWAV USBee SX]] (8ch, 100MHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Buspirate_v3.png|link=Dangerous Prototypes Buspirate|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Dangerous Prototypes Buspirate]] (5ch, 1MHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Dangerous prototypes irtoy mugshot.png|link=Dangerous Prototypes USB IR Toy|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Dangerous Prototypes USB IR Toy]] (1ch, 10kHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Eeelec xla esla100.png|link=EE Electronics ESLA100|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[EE Electronics ESLA100]] (8ch, 24MHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Ikalogic_scanalogic2.png|link=IKALOGIC Scanalogic-2|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[IKALOGIC Scanalogic-2]] (4ch, 20MHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Ikalogic scanaplus mugshot.png|link=IKALOGIC ScanaPLUS|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[IKALOGIC ScanaPLUS]] (9ch, 100MHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Kingst kqs3506 la16100.png|link=KingST KQS3506-LA16100|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[KingST KQS3506-LA16100]] (16ch, 100/50/32/16MHz @ 3/6/9/16ch)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Lcsoft-miniboard-front.png|link=Lcsoft Mini Board|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Lcsoft Mini Board]] (8/16ch, 24/12MHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:logic-shrimp-front.png|link=Logic Shrimp|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Logic Shrimp]] (4ch, 20MHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Mcu123 saleae logic clone.png|link=MCU123 Saleae Logic clone|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[MCU123 Saleae Logic clone]] (8ch, 24MHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Usbee_ax_clone_front.png|link=MCU123 USBee AX Pro clone|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[MCU123 USBee AX Pro clone]] (8ch, 24MHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Mcupro_Logic16_overview.png|link=mcupro Logic16 clone|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[mcupro Logic16 clone]] (16ch, 100MHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Openbench logic sniffer front.png|link=Openbench Logic Sniffer|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Openbench Logic Sniffer]] (32ch, 100MHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Prist akip 9101 mugshot.png|link=Prist AKIP-9101|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Prist AKIP-9101]] (16ch, 200MHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Robomotic buglogic3.png|link=Robomotic BugLogic 3|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Robomotic BugLogic 3]] (8ch, 24MHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Robomotic_minilogic.png|link=Robomotic MiniLogic|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Robomotic MiniLogic]] (8ch, 24MHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Saleae Logic.png|link=Saleae Logic|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Saleae Logic]] (8ch, 24MHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Saleae_Logic16_bottom.png|link=Saleae Logic16|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Saleae Logic16]] (16ch, 100/50/32/16MHz @ 3/6/9/16ch)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Saanlima Pipistrello-OLS.png|link=Saanlima Pipistrello OLS|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Saanlima Pipistrello OLS]] (32ch, 100MHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Sysclk lwla1034 mugshot.png|link=Sysclk LWLA1034|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Sysclk LWLA1034]] (34ch, 125MHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Wayengineer saleae16.png|link=WayEngineer Saleae16|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[WayEngineer Saleae16]] (16ch, 100/50/32/16MHz @ 3/6/9/16ch)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Zeroplus Logic Cube.png|link=ZEROPLUS Logic Cube LAP-C(16032)|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[ZEROPLUS Logic Cube LAP-C(16032)]] (16ch, 100MHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Zeroplus Logic Cube.png|link=ZEROPLUS Logic Cube LAP-C(322000)|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[ZEROPLUS Logic Cube LAP-C(322000)]] (32ch, 200MHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Zeroplus_lap-16128u.png|link=ZEROPLUS LAP-16128U|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[ZEROPLUS LAP-16128U]] (16ch, 200MHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:DSLogic.png|link=DreamSourceLab DSLogic|[[File:Nuvola Orange.png|16px]] &amp;lt;small&amp;gt;[[DreamSourceLab DSLogic]] (16ch, 400MHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Hsa-logic.png|link=HSA Logic|[[File:Nuvola Orange.png|16px]] &amp;lt;small&amp;gt;[[HSA Logic]] (8ch, 6.25MHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:RockyLogic Ant18e.png|link=RockyLogic Ant18e|[[File:Nuvola Orange.png|16px]] &amp;lt;small&amp;gt;[[RockyLogic Ant18e]] (8ch, 1GHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Sysclk lwla1016.png|link=Sysclk LWLA1016|[[File:Nuvola Orange.png|16px]] &amp;lt;small&amp;gt;[[Sysclk LWLA1016]] (16ch, 100MHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:Acute_pkla1216.png|link=Acute PKLA-1216|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Acute PKLA-1216]] (16ch, 200MHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Hantek 4032l mugshot.png|link=Hantek 4032L|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Hantek 4032L]] (32ch, 400MHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Ideofy_la_08.png|link=Ideofy LA-08|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Ideofy LA-08]] (8ch, 96/60/30MHz @ 2/4/8ch)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Intronix Logicport.png|link=Intronix Logicport LA1034|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Intronix Logicport LA1034]] (34ch, 500MHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Sigrok_logo_no_text_transparent_512.png|link=Link Instruments LA-5580|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Link Instruments LA-5580]] (80ch, 500MHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Microchip_pickit2.png|link=Microchip PICkit2|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Microchip PICkit2]] (3ch, 1MHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Minila parport.png|link=MiniLA|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[MiniLA]] (32ch, 100MHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Minila_mockup.png|link=MiniLA Mockup|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[MiniLA Mockup]] (32ch, 100MHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Noname_la16_mugshot.png|link=Noname LA16|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Noname LA16]] (16ch, 100MHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Noname xl logic16 100m mugshot.png|link=Noname XL-LOGIC16-100M|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Noname XL-LOGIC16-100M]] (16ch, 100/50/32/16MHz @ 3/6/9/16ch)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Rockylogic_ant8.png|link=RockyLogic Ant8|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[RockyLogic Ant8]] (8ch, 500MHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Sysclk lwla2034 mugshot.png|link=Sysclk LWLA2034|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Sysclk LWLA2034]] (34ch, 200MHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Techtools_digiview_dv1-100.png|link=TechTools DigiView DV1-100|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[TechTools DigiView DV1-100]] (18ch, 100MHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Xmos xtag2.png|link=XMOS XTAG-2|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[XMOS XTAG-2]] (?ch, 50MHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Zlg_la1032.png|link=ZLG LA1032|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[ZLG LA1032]] (32ch, 100MHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mixed-signal devices ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=105px heights=105px&amp;gt;&lt;br /&gt;
File:Armfly_ax_pro.png|link=ARMFLY AX-Pro|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[ARMFLY AX-Pro]]&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; (8ch, 24MHz; 2ch analog, 24MSa/s, 40MHz BW)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Sysclk ax pro mugshot.png|link=Sysclk AX-Pro|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Sysclk AX-Pro]]&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; (8ch, 24MHz; 2ch analog, 24MSa/s, 3MHz BW)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Esla201a.png|link=EE Electronics ESLA201A|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[EE Electronics ESLA201A]]&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; (8ch, 24MHz; 2ch analog, 24MSa/s, 40MHz BW)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Rigol DS1052E.png|link=Rigol DS1000 series|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Rigol DS1000 series|Rigol DS1000D series]] (16ch, 2ch analog, 50-150MHz BW)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Rigol_VS5202D.png|link=Rigol VS5000 series|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Rigol VS5000 series|Rigol VS5000D series]] (16ch, 2ch analog, 20-200MHz BW&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Yokogawa DLM2000 front.png|link=Yokogawa DLM2000 series|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Yokogawa DLM2000 series]] (8ch, 2/4ch analog, 2.5GSa/s, 200/350/500MHz BW)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Xzl studio ax mugshot.png|link=XZL_Studio AX|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[XZL_Studio AX]]&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; (8ch, 24MHz; 2ch analog, 24MSa/s, 40MHz BW)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:BitScope BS10.png|link=BitScope BS10|[[File:Nuvola Orange.png|16px]] &amp;lt;small&amp;gt;[[BitScope BS10]] (8ch, 40MHz; 2ch analog, 20MSa/s, ? BW)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Link Instruments MSO-19 front.png|link=Link Instruments MSO-19|[[File:Nuvola Orange.png|16px]] &amp;lt;small&amp;gt;[[Link Instruments MSO-19]] (8ch, 200MHz; 1ch analog, 200MSa/s, 60MHz BW)&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:Agilent_MSO7104A.png|link=Agilent MSO7104A|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Agilent MSO7104A]] (16ch, ?; 4ch analog, 2GSa/s, 1GHz BW)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Digilent_analog_discovery.png|link=Digilent Analog Discovery|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Digilent Analog Discovery]] (16ch, 100MHz; 2ch analog, 100MSa/s, 5MHz BW)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Hantek_1008C.png|link=Hantek 1008C|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Hantek 1008C]] (8ch)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Lab nation smartscope mugshot.png|link=LabNation SmartScope|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[LabNation SmartScope]] (8ch, 100MHz; 2ch analog, 100MSa/s, 45MHz BW)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Meilhaus_mephisto_scope1.png|link=Meilhaus MEphisto Scope1|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Meilhaus MEphisto Scope1]] (16ch, 100kHz; 2ch analog, 1MSa/s, 500kHz BW)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Polabs_poscope_basic2.png|link=PoLabs PoScope Basic2|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[PoLabs PoScope Basic2]] (16ch, 8MHz; 2ch analog, 200kSa/s, ? BW)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:QuantAsylum QA100.png|link=QuantAsylum QA100|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[QuantAsylum QA100]] (12ch; 2ch analog)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Saleae Logic Pro 16 bottom.jpg|link=Saleae Logic Pro 16|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Saleae Logic Pro 16]] (4/16ch, 500/100MHz; 16ch analog, 50MSa/s, 5MHz BW)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Sigrok_logo_no_text_transparent_512.png|link=XZL_Studio DX|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[XZL_Studio DX]] (16ch, 24MHz; 2ch analog)&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; Only the logic analyzer functionality is supported so far, analog support is work in progress.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Oscilloscopes ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=100px heights=100px&amp;gt;&lt;br /&gt;
File:Agilent DSO1014A.png|link=Agilent DSO1000 series|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Agilent DSO1000 series]] (2-4ch, 2GS/s, 60-200MHz BW)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Fluke_Scopemeter_199B.png|link=Fluke ScopeMeter 199B|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Fluke ScopeMeter 199B]] (2ch, 2.5GS/s, 200MHz BW)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Hameg HMO2024.png|link=Hameg HMO compact series|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Hameg HMO compact series]] (2-4ch, 2GS/s, 70-200MHz BW)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Hantek DSO-2090.png|link=Hantek DSO-2090|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Hantek DSO-2090]] (2ch, 100MS/s, 40MHz)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Rigol DS1052E.png|link=Rigol DS1000 series|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Rigol DS1000 series|Rigol DS1000E series]] (2ch, 1GS/s, 50-150MHz BW)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Rigol-ds2072 mugshot.png|link=Rigol DS2000 series|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Rigol DS2000 series]] (2ch, 2GS/s, 70-200MHz BW)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Rigol_VS5202D.png|link=Rigol VS5000 series|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Rigol VS5000 series]] (2ch, 20-200MHz BW)&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:Hantek dso2250 mugshot.png|link=Hantek DSO-2250|[[File:Nuvola Orange.png|16px]] &amp;lt;small&amp;gt;[[Hantek DSO-2250]] (2ch, 250MS/s, 100MHz BW)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Hantek dso-5200a device front.png|link=Hantek DSO-5200A|[[File:Nuvola Orange.png|16px]] &amp;lt;small&amp;gt;[[Hantek DSO-5200A]] (2ch, 250MS/s, 200MHz BW)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:OsciPrime.png|link=Nexus-Computing OsciPrime|[[File:Nuvola Orange.png|16px]] &amp;lt;small&amp;gt;[[Nexus-Computing OsciPrime]] (2ch, ?MS/s, 3.3MHz-8MHz BW)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Velleman PCSU1000.png|link=Velleman PCSU1000|[[File:Nuvola Orange.png|16px]] &amp;lt;small&amp;gt;[[Velleman PCSU1000]] (2ch, 1GS/s, 50MHz BW)&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:Fluke scopemeter123.png|link=Fluke ScopeMeter 123|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Fluke ScopeMeter 123]] (2ch, 25MS/s, 20MHz BW)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Focussz_fosc21_mugshot.png|link=Focussz Fosc21|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Focussz Fosc21]] (2ch, 8kS/s, 3kHz BW)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Hantek 6022be.jpg|link=Hantek 6022BE|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Hantek 6022BE]] (2ch, 48MS/s, 20MHz BW)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Hantek front.jpg|link=Hantek 6052BE|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Hantek 6052BE]] (2ch, 150MS/s, 50MHz BW)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Sigrok_logo_no_text_transparent_512.png|link=Hantek DSO-1200|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Hantek DSO-1200]] (2ch, 500MS/s, 200MHz BW)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Usbduxfast.png|link=Incite Technology USB-DUXfast|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Incite Technology USB-DUXfast]] (16ch, 3MHz, ? BW)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Sigrok_logo_no_text_transparent_512.png|link=Owon SDS series|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Owon SDS series]] (2ch, 0.5-3.2GS/s, 60-300MHz BW)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Picoscope 2203.png|link=Pico Technology PicoScope 2203|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Pico Technology PicoScope 2203]] (40/20MS/s, 5MHz BW)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:PicoScope_2205.png|link=Pico Technology PicoScope 2205|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Pico Technology PicoScope 2205]] (200/100MS/s, 25MHz BW)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Picoscope 3206.png|link=Pico Technology PicoScope 3206|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Pico Technology PicoScope 3206]] (200/100MS/s, 200MHz BW)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Picoscope 5203.png|link=Pico Technology PicoScope 5203|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Pico Technology PicoScope 5203]] (1/0.5GS/s, 250MHz BW)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Tektronix tds2024b mugshot.png|link=Tektronix TDS2000B series|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Tektronix TDS2000B series]] (2-4ch, 1-2GS/s, 60-200MHz BW)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:UNI-T UTD2042C.png|link=UNI-T UTD2042C|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[UNI-T UTD2042C]] (2ch, 500MS/s, 40MHz BW)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:VellemanWFS210.png|link=Velleman WFS210|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Velleman WFS210]] (2ch, 10MS/s, ?? MHz BW)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Voltcraft dso-220 usb.png|link=Voltcraft DSO-220|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Voltcraft DSO-220]] (2ch, 60MS/s, 20MHz BW)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Voltcraft DSO-3062C.png|link=Voltcraft DSO-3062C|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Voltcraft DSO-3062C]] (2ch, 1GS/s, 60MHz BW)&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Multimeters ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;100px&amp;quot; heights=&amp;quot;100px&amp;quot;&amp;gt;&lt;br /&gt;
File:Agilent U1232A.png|link=Agilent U12xxx series|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Agilent U12xxx series]] (USB/Bluetooth)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Bbc gm m2110 mugshot.png|link=BBC Goertz Metrawatt M2110|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[BBC Goertz Metrawatt M2110]] (30000 counts, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Brymen BM257.png|link=Brymen BM257|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Brymen BM257]] (6000 counts, RS232/USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Brymen bm257s mugshot.png|link=Brymen BM257s|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Brymen BM257s]] (6000 counts, RS232/USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Bm_857_mugshot_500000.png|link=Brymen BM857|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Brymen BM857]] (50000 counts, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Bm869_mugshot.png|link=Brymen BM869|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Brymen BM869]] (50000 counts, USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Digitek_dt4000zc_device_front.png|link=Digitek DT4000ZC|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Digitek DT4000ZC]] (4000 counts, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Fluke 187.png|link=Fluke 187/189|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Fluke 187/189]] (50000 counts, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Fluke 287.png|link=Fluke 287/289|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Fluke 287/289]] (50000 counts, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Gmc metrahit 14a logo.png|link=Gossen Metrawatt Metrahit 14A|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Gossen Metrawatt Metrahit 14A]] (3100 counts, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Gossen Metrawatt Metrahit 16I small.png|link=Gossen Metrawatt Metrahit 16I|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Gossen Metrawatt Metrahit 16I]] (3100 counts, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Gossen Metrawatt Metrahit 18S small.png|link=Gossen Metrawatt Metrahit 18S|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Gossen Metrawatt Metrahit 18S]] (31000 counts, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Gossen Metrawatt Metrahit 25S Logo.png|link=Gossen Metrawatt Metrahit 25S|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Gossen Metrawatt Metrahit 25S]] (31000 counts, RS232/USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Gmc kmm2002 logo.png|link=Gossen Metrawatt T-Com KMM2002|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Gossen Metrawatt T-Com KMM2002]] (3100 counts, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Gmc metrahit 29s logo.png|link=Gossen Metrawatt Metrahit 29S|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Gossen Metrawatt Metrahit 29S]] (310000 counts, RS232/USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:HT410 logo.png|link=HT Instruments HT410|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[HT Instruments HT410]] (3100 counts, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:100px_Idm103n.png|link=ISO-TECH IDM103N|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[ISO-TECH IDM103N]] (4000 counts, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Mastech mas345 device front.png|link=MASTECH MAS345|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[MASTECH MAS345]] (4000 counts, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Mastech ms8250b mugshot.png|link=MASTECH MS8250B|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[MASTECH MS8250B]] (4000 counts, USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Metex m4650cr mugshot.png|link=Metex M-4650CR|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Metex M-4650CR]] (20000 counts, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Metex_me-31.png|link=Metex ME-31|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Metex ME-31]] (4000 counts, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Norma dm950.png|link=Norma DM950|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Norma DM950]] (21000 counts, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Pce-pce-dm32.png|link=PCE PCE-DM32|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[PCE PCE-DM32]] (4000 counts, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Metex_me-31.png|link=PeakTech 3410|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[PeakTech 3410]] (4000 counts, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Peaktech 4370 device front.png|link=PeakTech 4370|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[PeakTech 4370]] (2000 counts, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Rs_22_168_mugshot.png|link=RadioShack 22-168|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[RadioShack 22-168]] (2000 counts, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Rs_22-805_front.png|link=RadioShack 22-805|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[RadioShack 22-805]] (4000 counts, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:radioshack_22_812_front.png|link=RadioShack 22-812|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[RadioShack 22-812]] (4000 counts, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:siemens_b1026_logo.png|link=Siemens B1026|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Siemens B1026]] (21000 counts, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Siemens B1105 small.png|link=Siemens B1105|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Siemens B1105]] (310000 counts, RS232/USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Tecpel dmm8061.png|link=Tecpel DMM-8061|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Tecpel DMM-8061]] (4000 counts, RS232/USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Tp4000zc_front.png|link=TekPower TP4000ZC|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[TekPower TP4000ZC]] (4000 counts, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Tenma 72-7745.png|link=Tenma 72-7745|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Tenma 72-7745]] (4000 counts, RS232/USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Ut60e_-_front_-_alpha.png|link=UNI-T UT60E|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[UNI-T UT60E]] (4000 counts, RS232/USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Uni-t ut61b mugshot.png|link=UNI-T UT61B|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[UNI-T UT61B]] (4000 counts, RS232/USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Uni-t ut61c mugshot.png|link=UNI-T UT61C|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[UNI-T UT61C]] (6000 counts, RS232/USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Uni t ut61d device.png|link=UNI-T UT61D|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[UNI-T UT61D]] (6000 counts, RS232/USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Old ver front.png|link=UNI-T UT61E|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[UNI-T UT61E]] (22000 counts, RS232/USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Ut71c mugshot.png|link=UNI-T UT71C|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[UNI-T UT71C]] (40000 counts, RS232/USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Va_va18b.png|link=V&amp;amp;A VA18B|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[V&amp;amp;A VA18B]] (6000 counts, USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Va va40b mugshot.png|link=V&amp;amp;A VA40B|link=V&amp;amp;A VA40B|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[V&amp;amp;A VA40B]] (6000 counts, USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Victor 70C.png|link=Victor 70C|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Victor 70C]] (4000 counts, USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Victor 86c device front.png|link=Victor 86C|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Victor 86C]] (4000 counts, USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Voltcraft m-3650cr.png|link=Voltcraft M-3650CR|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Voltcraft M-3650CR]] (2000 counts, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Voltcraft_M-3650D_transparent.png|link=Voltcraft M-3650D|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Voltcraft M-3650D]] (2000 counts, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Voltcraft m4650cr.png|link=Voltcraft M-4650CR|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Voltcraft M-4650CR]] (20000 counts, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Voltcraft ME-42 logo.png|link=Voltcraft ME-42|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Voltcraft ME-42]] (4000 counts, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Voltcraft vc820 device.png|link=Voltcraft VC-820|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Voltcraft VC-820]] (4000 counts, RS232/USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Voltcraft vc830.png|link=Voltcraft VC-830|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Voltcraft VC-830]] (6000 counts, RS232/USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Voltcraft vc840 device front.png|link=Voltcraft VC-840|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Voltcraft VC-840]] (4000 counts, RS232/USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Voltcraft vc920.png|link=Voltcraft VC-920|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Voltcraft VC-920]] (40000/4000 counts, RS232/USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Voltcraft vc940.png|link=Voltcraft VC-940|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Voltcraft VC-940]] (40000/4000 counts, RS232/USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:Tenma 72-1016.png|link=Tenma 72-1016|[[File:Nuvola Orange.png|16px]] &amp;lt;small&amp;gt;[[Tenma 72-1016]] (6000 counts, RS232/USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Tenma 72-7730.png|link=Tenma 72-7730|[[File:Nuvola Orange.png|16px]] &amp;lt;small&amp;gt;[[Tenma 72-7730]] (20000 counts, RS232/USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Tenma 72-7732.png|link=Tenma 72-7732|[[File:Nuvola Orange.png|16px]] &amp;lt;small&amp;gt;[[Tenma 72-7732]] (40000 counts, RS232/USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Tenma 72-7750.png|link=Tenma 72-7750|[[File:Nuvola Orange.png|16px]] &amp;lt;small&amp;gt;[[Tenma 72-7750]] (6000 counts, RS232/USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Tenma 72-9380A.png|link=Tenma 72-9380A|[[File:Nuvola Orange.png|16px]] &amp;lt;small&amp;gt;[[Tenma 72-9380A]] (40000 counts, RS232/USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:Appa 107.png|link=APPA 107|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[APPA 107]] (4000 / 20000 counts, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Digitek dt8000.png|link=Digitek DT8000|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Digitek DT8000]] (8000 counts, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Digitek dt80000.png|link=Digitek DT80000|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Digitek DT80000]] (80000 counts, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Escort 179 device front.png|link=Escort 179|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Escort 179]] (10000 counts, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Gossen metrahit 30m.png|link=Gossen-Metrawatt METRAHIT 30M|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Gossen-Metrawatt METRAHIT 30M]] (1200000 counts, RS232/USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:800px-Mastech m9803r device front.png|link=MASTECH M9803R|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[MASTECH M9803R]] (4000 counts, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Metrix mx53.png|link=Metrix MX53|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Metrix MX53]] (50000 counts, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Metrix mx56c.png|link=Metrix MX56C|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Metrix MX56C]] (50000 counts, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Peaktech 4380 mugshot.png|link=PeakTech 4380|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[PeakTech 4380]] (4000 counts, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Sigrok_logo_no_text_transparent_512.png|link=Protek 6500|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Protek 6500]] (50000 counts, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Voltcraft m3890dt usb.png|link=Voltcraft M-3890DT|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Voltcraft M-3890DT]] (4000 counts, USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Voltcraft m4660a device front.png|link=Voltcraft M-4660A|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Voltcraft M-4660A]] (20000 counts, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Sigrok_logo_no_text_transparent_512.png|link=Voltcraft VC-870|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Voltcraft VC-870]] (40000 counts, RS232/USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== LCR meters ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;100px&amp;quot; heights=&amp;quot;100px&amp;quot;&amp;gt;&lt;br /&gt;
File:Voltcraft4080_2.png|link=Voltcraft 4080|[[File:Nuvola Orange.png|16px]] &amp;lt;small&amp;gt;[[Voltcraft 4080]] (serial)&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sound level meters ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;100px&amp;quot; heights=&amp;quot;100px&amp;quot;&amp;gt;&lt;br /&gt;
File:CEM DT-8852.png|link=CEM DT-8852|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[CEM DT-8852]] (USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Colead SL-5868P.png|link=Colead SL-5868P|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Colead SL-5868P]] (RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Kecheng KC-330B.png|link=Kecheng KC-330B|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Kecheng KC-330B]] (RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Tondaj sl-814.png|link=Tondaj SL-814|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Tondaj SL-814]] (USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Voltcraft_DL-161S.png|link=Voltcraft DL-161S|[[File:Nuvola Orange.png|16px]] &amp;lt;small&amp;gt;[[Voltcraft DL-161S]] (USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Pce_pce-222_front.png|link=PCE PCE-222|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[PCE PCE-222]] (also: light-/thermo-/hygrometer; RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Voltcraft_dl_160s.png|link=Voltcraft DL-160S|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Voltcraft DL-160S]] (USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Thermometers ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;100px&amp;quot; heights=&amp;quot;100px&amp;quot;&amp;gt;&lt;br /&gt;
File:rs55ii.png|link=APPA 55II|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[APPA 55II]] (2xtemp, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:EL-USB-2.png|link=Lascar Electronics EL-USB-2|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Lascar Electronics EL-USB-2]] (1xtemp, 1xhum, USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Mic 98581.png|link=MIC 98581|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[MIC 98581]] (1xtemp, USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Mic 98583.png|link=MIC 98583|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[MIC 98583]] (1xtemp, 1xhum, USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Uni-t ut325 front.png|link=UNI-T UT325|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[UNI-T UT325]] (2xtemp, USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Voltcraft k204.png|link=Voltcraft K204|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Voltcraft K204]] (4xtemp, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Elitech rc3.png|link=Elitech RC-3|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Elitech RC-3]] (1xtemp, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Escort 19.png|link=Escort 19|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Escort 19]] (1x temp, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Pce_pce-222_front.png|link=PCE PCE-222|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[PCE PCE-222]] (1xtemp, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Rding temper front.png|link=RDing TEMPer|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[RDing TEMPer]] (1xtemp, USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Rding temper gold device front.png|link=RDing TEMPer Gold|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[RDing TEMPer Gold]] (1xtemp, USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Rding temper1 device front.png|link=RDing TEMPer1|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[RDing TEMPer1]] (1xtemp, USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Pcsensor_temper1k2.png|link=RDing TEMPer1K2|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[RDing TEMPer1K2]] (1xtemp, USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Voltcraft dl-120th.png|link=Voltcraft DL-120TH|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Voltcraft DL-120TH]] (1xtemp, USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Voltcraft dl-140th.png|link=Voltcraft DL-140TH|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Voltcraft DL-140TH]] (1xtemp, USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hygrometers ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;100px&amp;quot; heights=&amp;quot;100px&amp;quot;&amp;gt;&lt;br /&gt;
File:EL-USB-2.png|link=Lascar Electronics EL-USB-2|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Lascar Electronics EL-USB-2]] (temp/humidity, USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Mic 98583.png|link=MIC 98583|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[MIC 98583]] (temp/humidity, USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Pce_pce-222_front.png|link=PCE PCE-222|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[PCE PCE-222]] (also: light-/soundlevelmeter; RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Silabs si7005usb dgl eb top.jpg|link=SiLabs Si7005USB-Dongle|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[SiLabs Si7005USB-Dongle]] (USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Anemometers ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;100px&amp;quot; heights=&amp;quot;100px&amp;quot;&amp;gt;&lt;br /&gt;
File:Mastech ms6252b.png|link=MASTECH MS6252B|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[MASTECH MS6252B]] (USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Light meters ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;100px&amp;quot; heights=&amp;quot;100px&amp;quot;&amp;gt;&lt;br /&gt;
File:Lutron YK-2005LX.png|link=Lutron YK-2005LX|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Lutron YK-2005LX]] (RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Pce_pce-222_front.png|link=PCE PCE-222|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[PCE PCE-222]] (RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Energy meters ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;100px&amp;quot; heights=&amp;quot;100px&amp;quot;&amp;gt;&lt;br /&gt;
File:Actaris_a14c5_teleinfo.png|link=EDF Teleinfo|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[EDF Teleinfo]] (RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Acme.png|link=BayLibre ACME|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[BayLibre ACME]] (I2C)&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== DAQs ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;100px&amp;quot; heights=&amp;quot;100px&amp;quot;&amp;gt;&lt;br /&gt;
File:Ni usb 6008.png|link=NI USB-6008|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[NI USB-6008]] (8/2 analog inputs/outputs, 12 digital I/Os)&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Dataloggers ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;100px&amp;quot; heights=&amp;quot;100px&amp;quot;&amp;gt;&lt;br /&gt;
File:EL-USB-CO.png|link=Lascar Electronics EL-USB-CO|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Lascar Electronics EL-USB-CO]] (carbon monoxide (CO) logger, USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Testo_435-4.png|link=Testo 435-4|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Testo 435-4]] (USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Gsg_indoor_air_monitor.png|link=GSG Indoor Air Monitor|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[GSG Indoor Air Monitor]] (air quality monitor, USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Maul_studio_i.png|link=MAUL studio i|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[MAUL studio i]] (weighing scale, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Voltcraft co-20.png|link=Voltcraft CO-20|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Voltcraft CO-20]] (air quality monitor, USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tachometers ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;100px&amp;quot; heights=&amp;quot;100px&amp;quot;&amp;gt;&lt;br /&gt;
File:Uni-t ut372 mugshot.png|link=UNI-T UT372|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[UNI-T UT372]] (USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Digital loads ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;100px&amp;quot; heights=&amp;quot;100px&amp;quot;&amp;gt;&lt;br /&gt;
File:Maynuo m9812 mugshot.png|link=Maynuo M9812|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Maynuo M9812]]&lt;br /&gt;
File:Atten ATZ9711.png|link=ATTEN ATZ9711|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[ATTEN ATZ9711]]&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Function generators ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;100px&amp;quot; heights=&amp;quot;100px&amp;quot;&amp;gt;&lt;br /&gt;
File:Hantek DDS-3X25 top.png|link=Hantek DDS-3X25|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Hantek DDS-3X25]] (25MHz, PC-based, USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Siglent sdg1010 device front 8116.png|link=Siglent SDG1010|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Siglent SDG1010]] (10MHz, USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== RF receivers ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;100px&amp;quot; heights=&amp;quot;100px&amp;quot;&amp;gt;&lt;br /&gt;
File:Per vices noctar.png|link=Per Vices Noctar|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Per Vices Noctar]] (100kHz-4GHz, IQ modulator/demodulator, PCIe)&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Spectrum analyzers ==&lt;br /&gt;
&lt;br /&gt;
TODO.&lt;br /&gt;
&lt;br /&gt;
== Power supplies ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;100px&amp;quot; heights=&amp;quot;100px&amp;quot;&amp;gt;&lt;br /&gt;
File:Atten PPS3203T-3S.png|link=Atten PPS3203T-3S|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Atten PPS3203T-3S]] (3ch, 2x 0-32V, 1x 0-6V at 0-3A, USB&amp;amp;RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Chroma_61604_front.png|link=Chroma 61604|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Chroma 61604]] (1ch, 0-300V, 0-16A, 2kVA)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Conrad_digi_35_cpu_logo.png|link=Conrad DIGI 35 CPU|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Conrad DIGI 35 CPU]] (1ch, 0-35V/0-2.55A, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Manson hcs3202.png|link=Manson HCS-3202|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Manson HCS-3202]] (1ch, 1-36V/0-10A, USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Motech_LPS-301_logo.png|link=Motech LPS-301|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Motech LPS-301]] (1ch, 1-32V/0-2A, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Philips PM2813.png|link=Philips PM2800 series|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;Fluke/Philips PM2800 series&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Rigol DP832.png|link=Rigol DP800 series|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Rigol DP800 series]]&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Voltcraft pps-11815 logo.png|link=Voltcraft PPS-11815|[[File:Nuvola OK.png|16px]] &amp;lt;small&amp;gt;[[Voltcraft PPS-11815]] (1ch, 0-60V/0-5A, USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
File:PS3005D front on.JPG|link=Velleman PS3005D|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Velleman PS3005D]] (1ch, 0-30V/0-5A, USB&amp;amp;RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Sigrok logo no text transparent 512.png|link=Voltcraft 18220|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Voltcraft 18220]] (1ch, 0-40V/0-5A, RS232)&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== GPIB interfaces ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;100px&amp;quot; heights=&amp;quot;100px&amp;quot;&amp;gt;&lt;br /&gt;
File:Beiming_s82357.png|link=Beiming S82357|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Beiming S82357]] (hardware-based, USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:ICS 488-USB.png|link=ICS 488-USB|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[ICS 488-USB]] (hardware-based, USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:GPIB-USB 82357B clone.png|link=GPIB-USB 82357B clone|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[GPIB-USB 82357B clone]] (hardware-based, USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:NI GPIB-ENET.png|link=National Instruments GPIB-ENET|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[National Instruments GPIB-ENET]] (hardware-based, Ethernet)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:NI GPIB-USB-HS.png|link=National Instruments GPIB-USB-HS|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[National Instruments GPIB-USB-HS]] (hardware-based, USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Prologix-usb.png|link=Prologix GPIB-USB|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Prologix GPIB-USB]] (firmware-based, USB)&amp;lt;/small&amp;gt;&lt;br /&gt;
File:GalvantGPIBUSBrev4.JPG|link=Galvant GPIBUSB|[[File:Nuvola Red.png|16px]] &amp;lt;small&amp;gt;[[Galvant GPIBUSB]] (firmware-based, USB, OSHW)&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Potential other candidates ==&lt;br /&gt;
&lt;br /&gt;
If you own any other logic analyzers, oscilloscopes, multimeters, dataloggers, ... and want to add support for them in sigrok (or donate/lend devices to developers), please let us know. We&amp;#039;re always happy to add more hardware support! Join the [https://lists.sourceforge.net/lists/listinfo/sigrok-devel mailing list] or ask on [irc://chat.freenode.net/sigrok IRC #sigrok] if you want to help out.&lt;br /&gt;
&lt;br /&gt;
__FORCETOC__&lt;/div&gt;</summary>
		<author><name>Danielk</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=User:Danielk/Simple_Internal_Compression_Proposal&amp;diff=10887</id>
		<title>User:Danielk/Simple Internal Compression Proposal</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=User:Danielk/Simple_Internal_Compression_Proposal&amp;diff=10887"/>
		<updated>2015-07-05T14:50:40Z</updated>

		<summary type="html">&lt;p&gt;Danielk: Grammar fix&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Goal ==&lt;br /&gt;
&lt;br /&gt;
Many logic analyzers and file formats support simple stream compression; usually employing some variation of RLE. However, within sigrok logic streams are currently always uncompressed, and a driver for a device with compression has to expand the compressed stream coming from the device before passing it on.&lt;br /&gt;
&lt;br /&gt;
This is not a problem for disk storage, since many of the output modules re-compress the logic stream (e.g. ZIP for the srzip format, or RLE for the VCD format). It is also not a problem if the run lengths for each sample are very short.&lt;br /&gt;
&lt;br /&gt;
However, the worst case behavior is incredibly awful. For instance, with many LAs it is very easy to fill Gigabytes of RAM within seconds, simply by forgetting to turn on the signal source before starting acquisition. It makes for a very bad user experience if a simple mistake like that instantly puts your machine into swap death.&lt;br /&gt;
&lt;br /&gt;
Apart from mistakes that can be made, there are also legitimate reasons to over-sample logic signals -- for instance, if accurate timing information is required.&lt;br /&gt;
&lt;br /&gt;
Even if the RAM is not exhausted, processing will be very slow if streams contain Kilobytes or even Megabytes of consecutive identical samples. This applies to all stages in the processing pipeline, including decoders and display in PulseView.&lt;br /&gt;
&lt;br /&gt;
Therefore, sigrok should support some means of internal stream compression. The compression scheme does not need to be particularly efficient. It should be some form of RLE, to allow easy transcoding from one format to another without having to expand the data. It is not intended to replace srzip compression. However, it would make sense to apply ZIP on top of RLE, in order to avoid having to expand the data at any point.&lt;br /&gt;
&lt;br /&gt;
== Proposed Format ==&lt;br /&gt;
&lt;br /&gt;
Currently, logic data feed packets have a channel count and a unit size in bytes. For the LWLA1034, the channel count is 34 and the unit size is 5. Each sample looks like this:&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;
!Byte 0&lt;br /&gt;
!Byte 1&lt;br /&gt;
!Byte 2&lt;br /&gt;
!Byte 3&lt;br /&gt;
!Byte 4&lt;br /&gt;
|-&lt;br /&gt;
| Ch. 7..0&lt;br /&gt;
| Ch. 15..8&lt;br /&gt;
| Ch. 23..16&lt;br /&gt;
| Ch. 31..24&lt;br /&gt;
| Ch. 33..32&lt;br /&gt;
|}&lt;br /&gt;
The 6 high bits of byte 4 are unused.&lt;br /&gt;
&lt;br /&gt;
This could be extended by introducing another parameter &amp;#039;&amp;#039;repeat count width&amp;#039;&amp;#039;, specifying the number of bits to use for the repeat count. The choice of a good width would be at the discretion of the driver and may vary from one acquisition to another. However, &amp;#039;&amp;#039;channel count&amp;#039;&amp;#039; plus &amp;#039;&amp;#039;repeat count width&amp;#039;&amp;#039; must be not be greater than 8 times the &amp;#039;&amp;#039;unit size&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
As an example, the LWLA1034 driver could specify a &amp;#039;&amp;#039;repeat count width&amp;#039;&amp;#039; of 30, which makes for a nice &amp;#039;&amp;#039;unit size&amp;#039;&amp;#039; of 8 bytes. Each sample would then look like this:&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;
!Byte 0&lt;br /&gt;
!Byte 1&lt;br /&gt;
!Byte 2&lt;br /&gt;
!Byte 3&lt;br /&gt;
!Byte 4&lt;br /&gt;
!Byte 5&lt;br /&gt;
!Byte 6&lt;br /&gt;
!Byte 7&lt;br /&gt;
|-&lt;br /&gt;
| Ch. 7..0&lt;br /&gt;
| Ch. 15..8&lt;br /&gt;
| Ch. 23..16&lt;br /&gt;
| Ch. 31..24&lt;br /&gt;
| Rep. 5..0, Ch. 33..32&lt;br /&gt;
| Rep 13..6&lt;br /&gt;
| Rep 21..14&lt;br /&gt;
| Rep 29..22&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For ease of processing, the repeat count width should be restricted to at most 31 bits, so that it fits into a 32-bit integer while allowing some room for arithmetic without overflow. For devices that generate larger repeat counts, it is easy enough to split up longer runs on the fly. Also, the repeat count should not be allowed to span more than 4 bytes.&lt;br /&gt;
&lt;br /&gt;
Instead of requiring tight packing of the channel state and repeat count bits, one could also have a &amp;#039;&amp;#039;repeat count offset&amp;#039;&amp;#039; property which specifies the bit index at which the repeat count starts. This would allow an efficient arrangement for e.g. a 28 channels device with a 31-bit repeat count stored in bytes 4 to 7, while satisfying the 4-byte span restriction and guaranteeing 32-bit alignment. The separate property should make no difference to the extraction speed.&lt;br /&gt;
&lt;br /&gt;
There should be no guarantee that the RLE-encoded stream is minimal. That is, it is legitimate for a driver to produce consecutive identical samples with run lengths less than the maximum. This avoids the need for the driver to carry state from one chunk of data to the next.&lt;br /&gt;
&lt;br /&gt;
The input/output modules should do what is sensible for the format. E.g. the VCD output can just re-use the incoming run lengths without intermediate expansion. The VCD input module should generate RLE-compressed data feeds. The srzip writer should apply ZIP on top on the RLE-compressed data feed.&lt;br /&gt;
&lt;br /&gt;
== API Thoughts ==&lt;br /&gt;
&lt;br /&gt;
In order to make life easy for processing modules and client code, libsigrok should provide helper macros and/or inline functions to deal with RLE data feeds. In particular, there should be a function to extract the repeat count of a sample as an integer. On machines which permit unaligned 32-bit reads (and assuming the &amp;#039;&amp;#039;unit size&amp;#039;&amp;#039; is at least 4), this function could just do a single memory read (and a byte swap on BE machines) followed by a right shift.&lt;br /&gt;
&lt;br /&gt;
An alternative implementation would be to have a fast path if &amp;#039;&amp;#039;unit size&amp;#039;&amp;#039; is divisible by 4 and a generic fallback path doing byte-wise extraction. This variant would never generate unaligned reads (assuming the data feed starts on an aligned address) and needs fewer conditionals.&lt;br /&gt;
&lt;br /&gt;
The channel state extraction does not change from how it works now, except that care has to be taken to mask unused bits in the last channel state byte, if any. However, in the same vein as above, it would make sense to introduce inline helper functions to simplify indexed access to single channels.&lt;br /&gt;
&lt;br /&gt;
Optionally, an extension to the protocol decoder Python API may allow decoders to process unexpanded RLE data. This could speed up decoding quite significantly in some situations.&lt;/div&gt;</summary>
		<author><name>Danielk</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=User:Danielk/Simple_Internal_Compression_Proposal&amp;diff=10886</id>
		<title>User:Danielk/Simple Internal Compression Proposal</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=User:Danielk/Simple_Internal_Compression_Proposal&amp;diff=10886"/>
		<updated>2015-07-05T14:48:55Z</updated>

		<summary type="html">&lt;p&gt;Danielk: Propose additional repeat count index&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Goal ==&lt;br /&gt;
&lt;br /&gt;
Many logic analyzers and file formats support simple stream compression; usually employing some variation of RLE. However, within sigrok logic streams are currently always uncompressed, and a driver for a device with compression has to expand the compressed stream coming from the device before passing it on.&lt;br /&gt;
&lt;br /&gt;
This is not a problem for disk storage, since many of the output modules re-compress the logic stream (e.g. ZIP for the srzip format, or RLE for the VCD format). It is also not a problem if the run lengths for each sample are very short.&lt;br /&gt;
&lt;br /&gt;
However, the worst case behavior is incredibly awful. For instance, with many LAs it is very easy to fill Gigabytes of RAM within seconds, simply by forgetting to turn on the signal source before starting acquisition. It makes for a very bad user experience if a simple mistake like that instantly puts your machine into swap death.&lt;br /&gt;
&lt;br /&gt;
Apart from mistakes that can be made, there are also legitimate reasons to over-sample logic signals -- for instance, if accurate timing information is required.&lt;br /&gt;
&lt;br /&gt;
Even if the RAM is not exhausted, processing will be very slow if streams contain Kilobytes or even Megabytes of consecutive identical samples. This applies to all stages in the processing pipeline, including decoders and display in PulseView.&lt;br /&gt;
&lt;br /&gt;
Therefore, sigrok should support some means of internal stream compression. The compression scheme does not need to be particularly efficient. It should be some form of RLE, to allow easy transcoding from one format to another without having to expand the data. It is not intended to replace srzip compression. However, it would make sense to apply ZIP on top of RLE, in order to avoid having to expand the data at any point.&lt;br /&gt;
&lt;br /&gt;
== Proposed Format ==&lt;br /&gt;
&lt;br /&gt;
Currently, logic data feed packets have a channel count and a unit size in bytes. For the LWLA1034, the channel count is 34 and the unit size is 5. Each sample looks like this:&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;
!Byte 0&lt;br /&gt;
!Byte 1&lt;br /&gt;
!Byte 2&lt;br /&gt;
!Byte 3&lt;br /&gt;
!Byte 4&lt;br /&gt;
|-&lt;br /&gt;
| Ch. 7..0&lt;br /&gt;
| Ch. 15..8&lt;br /&gt;
| Ch. 23..16&lt;br /&gt;
| Ch. 31..24&lt;br /&gt;
| Ch. 33..32&lt;br /&gt;
|}&lt;br /&gt;
The 6 high bits of byte 4 are unused.&lt;br /&gt;
&lt;br /&gt;
This could be extended by introducing another parameter &amp;#039;&amp;#039;repeat count width&amp;#039;&amp;#039;, specifying the number of bits to use for the repeat count. The choice of a good width would be at the discretion of the driver and may vary from one acquisition to another. However, &amp;#039;&amp;#039;channel count&amp;#039;&amp;#039; plus &amp;#039;&amp;#039;repeat count width&amp;#039;&amp;#039; must be not be greater than 8 times the &amp;#039;&amp;#039;unit size&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
As an example, the LWLA1034 driver could specify a &amp;#039;&amp;#039;repeat count width&amp;#039;&amp;#039; of 30, which makes for a nice &amp;#039;&amp;#039;unit size&amp;#039;&amp;#039; of 8 bytes. Each sample would then look like this:&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;
!Byte 0&lt;br /&gt;
!Byte 1&lt;br /&gt;
!Byte 2&lt;br /&gt;
!Byte 3&lt;br /&gt;
!Byte 4&lt;br /&gt;
!Byte 5&lt;br /&gt;
!Byte 6&lt;br /&gt;
!Byte 7&lt;br /&gt;
|-&lt;br /&gt;
| Ch. 7..0&lt;br /&gt;
| Ch. 15..8&lt;br /&gt;
| Ch. 23..16&lt;br /&gt;
| Ch. 31..24&lt;br /&gt;
| Rep. 5..0, Ch. 33..32&lt;br /&gt;
| Rep 13..6&lt;br /&gt;
| Rep 21..14&lt;br /&gt;
| Rep 29..22&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For ease of processing, the repeat count width should be restricted to at most 31 bits, so that it fits into a 32-bit integer while allowing some room for arithmetic without overflow. For devices that generate larger repeat counts, it is easy enough to split up longer runs on the fly. Also, the repeat count should not be allowed to span more than 4 bytes.&lt;br /&gt;
&lt;br /&gt;
Instead of requiring tight packing of the channel state and repeat count bits, one could also have a &amp;#039;&amp;#039;repeat count offset&amp;#039;&amp;#039; property which specifies the bit index at which the repeat count starts. This would allow an efficient arrangement for e.g. an 28 channels device with an 31-bit repeat count stored in bytes 4 to 7, while satisfying the 4-byte span restriction and guaranteeing 32-bit alignment. The separate property should make no difference to the extraction speed.&lt;br /&gt;
&lt;br /&gt;
There should be no guarantee that the RLE-encoded stream is minimal. That is, it is legitimate for a driver to produce consecutive identical samples with run lengths less than the maximum. This avoids the need for the driver to carry state from one chunk of data to the next.&lt;br /&gt;
&lt;br /&gt;
The input/output modules should do what is sensible for the format. E.g. the VCD output can just re-use the incoming run lengths without intermediate expansion. The VCD input module should generate RLE-compressed data feeds. The srzip writer should apply ZIP on top on the RLE-compressed data feed.&lt;br /&gt;
&lt;br /&gt;
== API Thoughts ==&lt;br /&gt;
&lt;br /&gt;
In order to make life easy for processing modules and client code, libsigrok should provide helper macros and/or inline functions to deal with RLE data feeds. In particular, there should be a function to extract the repeat count of a sample as an integer. On machines which permit unaligned 32-bit reads (and assuming the &amp;#039;&amp;#039;unit size&amp;#039;&amp;#039; is at least 4), this function could just do a single memory read (and a byte swap on BE machines) followed by a right shift.&lt;br /&gt;
&lt;br /&gt;
An alternative implementation would be to have a fast path if &amp;#039;&amp;#039;unit size&amp;#039;&amp;#039; is divisible by 4 and a generic fallback path doing byte-wise extraction. This variant would never generate unaligned reads (assuming the data feed starts on an aligned address) and needs fewer conditionals.&lt;br /&gt;
&lt;br /&gt;
The channel state extraction does not change from how it works now, except that care has to be taken to mask unused bits in the last channel state byte, if any. However, in the same vein as above, it would make sense to introduce inline helper functions to simplify indexed access to single channels.&lt;br /&gt;
&lt;br /&gt;
Optionally, an extension to the protocol decoder Python API may allow decoders to process unexpanded RLE data. This could speed up decoding quite significantly in some situations.&lt;/div&gt;</summary>
		<author><name>Danielk</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=User:Danielk/Simple_Internal_Compression_Proposal&amp;diff=10885</id>
		<title>User:Danielk/Simple Internal Compression Proposal</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=User:Danielk/Simple_Internal_Compression_Proposal&amp;diff=10885"/>
		<updated>2015-07-05T14:22:14Z</updated>

		<summary type="html">&lt;p&gt;Danielk: Reword justification for 31-bit limit&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Goal ==&lt;br /&gt;
&lt;br /&gt;
Many logic analyzers and file formats support simple stream compression; usually employing some variation of RLE. However, within sigrok logic streams are currently always uncompressed, and a driver for a device with compression has to expand the compressed stream coming from the device before passing it on.&lt;br /&gt;
&lt;br /&gt;
This is not a problem for disk storage, since many of the output modules re-compress the logic stream (e.g. ZIP for the srzip format, or RLE for the VCD format). It is also not a problem if the run lengths for each sample are very short.&lt;br /&gt;
&lt;br /&gt;
However, the worst case behavior is incredibly awful. For instance, with many LAs it is very easy to fill Gigabytes of RAM within seconds, simply by forgetting to turn on the signal source before starting acquisition. It makes for a very bad user experience if a simple mistake like that instantly puts your machine into swap death.&lt;br /&gt;
&lt;br /&gt;
Apart from mistakes that can be made, there are also legitimate reasons to over-sample logic signals -- for instance, if accurate timing information is required.&lt;br /&gt;
&lt;br /&gt;
Even if the RAM is not exhausted, processing will be very slow if streams contain Kilobytes or even Megabytes of consecutive identical samples. This applies to all stages in the processing pipeline, including decoders and display in PulseView.&lt;br /&gt;
&lt;br /&gt;
Therefore, sigrok should support some means of internal stream compression. The compression scheme does not need to be particularly efficient. It should be some form of RLE, to allow easy transcoding from one format to another without having to expand the data. It is not intended to replace srzip compression. However, it would make sense to apply ZIP on top of RLE, in order to avoid having to expand the data at any point.&lt;br /&gt;
&lt;br /&gt;
== Proposed Format ==&lt;br /&gt;
&lt;br /&gt;
Currently, logic data feed packets have a channel count and a unit size in bytes. For the LWLA1034, the channel count is 34 and the unit size is 5. Each sample looks like this:&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;
!Byte 0&lt;br /&gt;
!Byte 1&lt;br /&gt;
!Byte 2&lt;br /&gt;
!Byte 3&lt;br /&gt;
!Byte 4&lt;br /&gt;
|-&lt;br /&gt;
| Ch. 7..0&lt;br /&gt;
| Ch. 15..8&lt;br /&gt;
| Ch. 23..16&lt;br /&gt;
| Ch. 31..24&lt;br /&gt;
| Ch. 33..32&lt;br /&gt;
|}&lt;br /&gt;
The 6 high bits of byte 4 are unused.&lt;br /&gt;
&lt;br /&gt;
This could be extended by introducing another parameter &amp;#039;&amp;#039;repeat count width&amp;#039;&amp;#039;, specifying the number of bits to use for the repeat count. The choice of a good width would be at the discretion of the driver and may vary from one acquisition to another. However, &amp;#039;&amp;#039;channel count&amp;#039;&amp;#039; plus &amp;#039;&amp;#039;repeat count width&amp;#039;&amp;#039; must be not be greater than 8 times the &amp;#039;&amp;#039;unit size&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
As an example, the LWLA1034 driver could specify a &amp;#039;&amp;#039;repeat count width&amp;#039;&amp;#039; of 30, which makes for a nice &amp;#039;&amp;#039;unit size&amp;#039;&amp;#039; of 8 bytes. Each sample would then look like this:&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;
!Byte 0&lt;br /&gt;
!Byte 1&lt;br /&gt;
!Byte 2&lt;br /&gt;
!Byte 3&lt;br /&gt;
!Byte 4&lt;br /&gt;
!Byte 5&lt;br /&gt;
!Byte 6&lt;br /&gt;
!Byte 7&lt;br /&gt;
|-&lt;br /&gt;
| Ch. 7..0&lt;br /&gt;
| Ch. 15..8&lt;br /&gt;
| Ch. 23..16&lt;br /&gt;
| Ch. 31..24&lt;br /&gt;
| Rep. 5..0, Ch. 33..32&lt;br /&gt;
| Rep 13..6&lt;br /&gt;
| Rep 21..14&lt;br /&gt;
| Rep 29..22&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For ease of processing, the repeat count width should be restricted to at most 31 bits, so that it fits into a 32-bit integer while allowing some room for arithmetic without overflow. For devices that generate larger repeat counts, it is easy enough to split up longer runs on the fly. Also, the repeat count should not be allowed to span more than 4 bytes.&lt;br /&gt;
&lt;br /&gt;
There should be no guarantee that the RLE-encoded stream is minimal. That is, it is legitimate for a driver to produce consecutive identical samples with run lengths less than the maximum. This avoids the need for the driver to carry state from one chunk of data to the next.&lt;br /&gt;
&lt;br /&gt;
The input/output modules should do what is sensible for the format. E.g. the VCD output can just re-use the incoming run lengths without intermediate expansion. The VCD input module should generate RLE-compressed data feeds. The srzip writer should apply ZIP on top on the RLE-compressed data feed.&lt;br /&gt;
&lt;br /&gt;
== API Thoughts ==&lt;br /&gt;
&lt;br /&gt;
In order to make life easy for processing modules and client code, libsigrok should provide helper macros and/or inline functions to deal with RLE data feeds. In particular, there should be a function to extract the repeat count of a sample as an integer. On machines which permit unaligned 32-bit reads (and assuming the &amp;#039;&amp;#039;unit size&amp;#039;&amp;#039; is at least 4), this function could just do a single memory read (and a byte swap on BE machines) followed by a right shift.&lt;br /&gt;
&lt;br /&gt;
An alternative implementation would be to have a fast path if &amp;#039;&amp;#039;unit size&amp;#039;&amp;#039; is divisible by 4 and a generic fallback path doing byte-wise extraction. This variant would never generate unaligned reads (assuming the data feed starts on an aligned address) and needs fewer conditionals.&lt;br /&gt;
&lt;br /&gt;
The channel state extraction does not change from how it works now, except that care has to be taken to mask unused bits in the last channel state byte, if any. However, in the same vein as above, it would make sense to introduce inline helper functions to simplify indexed access to single channels.&lt;br /&gt;
&lt;br /&gt;
Optionally, an extension to the protocol decoder Python API may allow decoders to process unexpanded RLE data. This could speed up decoding quite significantly in some situations.&lt;/div&gt;</summary>
		<author><name>Danielk</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=User:Danielk/Simple_Internal_Compression_Proposal&amp;diff=10884</id>
		<title>User:Danielk/Simple Internal Compression Proposal</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=User:Danielk/Simple_Internal_Compression_Proposal&amp;diff=10884"/>
		<updated>2015-07-05T12:41:18Z</updated>

		<summary type="html">&lt;p&gt;Danielk: Note that channel indexing could also use helper functions&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Goal ==&lt;br /&gt;
&lt;br /&gt;
Many logic analyzers and file formats support simple stream compression; usually employing some variation of RLE. However, within sigrok logic streams are currently always uncompressed, and a driver for a device with compression has to expand the compressed stream coming from the device before passing it on.&lt;br /&gt;
&lt;br /&gt;
This is not a problem for disk storage, since many of the output modules re-compress the logic stream (e.g. ZIP for the srzip format, or RLE for the VCD format). It is also not a problem if the run lengths for each sample are very short.&lt;br /&gt;
&lt;br /&gt;
However, the worst case behavior is incredibly awful. For instance, with many LAs it is very easy to fill Gigabytes of RAM within seconds, simply by forgetting to turn on the signal source before starting acquisition. It makes for a very bad user experience if a simple mistake like that instantly puts your machine into swap death.&lt;br /&gt;
&lt;br /&gt;
Apart from mistakes that can be made, there are also legitimate reasons to over-sample logic signals -- for instance, if accurate timing information is required.&lt;br /&gt;
&lt;br /&gt;
Even if the RAM is not exhausted, processing will be very slow if streams contain Kilobytes or even Megabytes of consecutive identical samples. This applies to all stages in the processing pipeline, including decoders and display in PulseView.&lt;br /&gt;
&lt;br /&gt;
Therefore, sigrok should support some means of internal stream compression. The compression scheme does not need to be particularly efficient. It should be some form of RLE, to allow easy transcoding from one format to another without having to expand the data. It is not intended to replace srzip compression. However, it would make sense to apply ZIP on top of RLE, in order to avoid having to expand the data at any point.&lt;br /&gt;
&lt;br /&gt;
== Proposed Format ==&lt;br /&gt;
&lt;br /&gt;
Currently, logic data feed packets have a channel count and a unit size in bytes. For the LWLA1034, the channel count is 34 and the unit size is 5. Each sample looks like this:&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;
!Byte 0&lt;br /&gt;
!Byte 1&lt;br /&gt;
!Byte 2&lt;br /&gt;
!Byte 3&lt;br /&gt;
!Byte 4&lt;br /&gt;
|-&lt;br /&gt;
| Ch. 7..0&lt;br /&gt;
| Ch. 15..8&lt;br /&gt;
| Ch. 23..16&lt;br /&gt;
| Ch. 31..24&lt;br /&gt;
| Ch. 33..32&lt;br /&gt;
|}&lt;br /&gt;
The 6 high bits of byte 4 are unused.&lt;br /&gt;
&lt;br /&gt;
This could be extended by introducing another parameter &amp;#039;&amp;#039;repeat count width&amp;#039;&amp;#039;, specifying the number of bits to use for the repeat count. The choice of a good width would be at the discretion of the driver and may vary from one acquisition to another. However, &amp;#039;&amp;#039;channel count&amp;#039;&amp;#039; plus &amp;#039;&amp;#039;repeat count width&amp;#039;&amp;#039; must be not be greater than 8 times the &amp;#039;&amp;#039;unit size&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
As an example, the LWLA1034 driver could specify a &amp;#039;&amp;#039;repeat count width&amp;#039;&amp;#039; of 30, which makes for a nice &amp;#039;&amp;#039;unit size&amp;#039;&amp;#039; of 8 bytes. Each sample would then look like this:&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;
!Byte 0&lt;br /&gt;
!Byte 1&lt;br /&gt;
!Byte 2&lt;br /&gt;
!Byte 3&lt;br /&gt;
!Byte 4&lt;br /&gt;
!Byte 5&lt;br /&gt;
!Byte 6&lt;br /&gt;
!Byte 7&lt;br /&gt;
|-&lt;br /&gt;
| Ch. 7..0&lt;br /&gt;
| Ch. 15..8&lt;br /&gt;
| Ch. 23..16&lt;br /&gt;
| Ch. 31..24&lt;br /&gt;
| Rep. 5..0, Ch. 33..32&lt;br /&gt;
| Rep 13..6&lt;br /&gt;
| Rep 21..14&lt;br /&gt;
| Rep 29..22&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For ease of processing, the repeat count width should be restricted to at most 31 bits, so that it fits into a signed 32-bit integer. For devices that generate larger repeat counts, it is easy enough to split up longer runs on the fly. Also, the repeat count should not be allowed to span more than 4 bytes.&lt;br /&gt;
&lt;br /&gt;
There should be no guarantee that the RLE-encoded stream is minimal. That is, it is legitimate for a driver to produce consecutive identical samples with run lengths less than the maximum. This avoids the need for the driver to carry state from one chunk of data to the next.&lt;br /&gt;
&lt;br /&gt;
The input/output modules should do what is sensible for the format. E.g. the VCD output can just re-use the incoming run lengths without intermediate expansion. The VCD input module should generate RLE-compressed data feeds. The srzip writer should apply ZIP on top on the RLE-compressed data feed.&lt;br /&gt;
&lt;br /&gt;
== API Thoughts ==&lt;br /&gt;
&lt;br /&gt;
In order to make life easy for processing modules and client code, libsigrok should provide helper macros and/or inline functions to deal with RLE data feeds. In particular, there should be a function to extract the repeat count of a sample as an integer. On machines which permit unaligned 32-bit reads (and assuming the &amp;#039;&amp;#039;unit size&amp;#039;&amp;#039; is at least 4), this function could just do a single memory read (and a byte swap on BE machines) followed by a right shift.&lt;br /&gt;
&lt;br /&gt;
An alternative implementation would be to have a fast path if &amp;#039;&amp;#039;unit size&amp;#039;&amp;#039; is divisible by 4 and a generic fallback path doing byte-wise extraction. This variant would never generate unaligned reads (assuming the data feed starts on an aligned address) and needs fewer conditionals.&lt;br /&gt;
&lt;br /&gt;
The channel state extraction does not change from how it works now, except that care has to be taken to mask unused bits in the last channel state byte, if any. However, in the same vein as above, it would make sense to introduce inline helper functions to simplify indexed access to single channels.&lt;br /&gt;
&lt;br /&gt;
Optionally, an extension to the protocol decoder Python API may allow decoders to process unexpanded RLE data. This could speed up decoding quite significantly in some situations.&lt;/div&gt;</summary>
		<author><name>Danielk</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=User:Danielk/Simple_Internal_Compression_Proposal&amp;diff=10883</id>
		<title>User:Danielk/Simple Internal Compression Proposal</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=User:Danielk/Simple_Internal_Compression_Proposal&amp;diff=10883"/>
		<updated>2015-07-05T12:34:10Z</updated>

		<summary type="html">&lt;p&gt;Danielk: Describe alternative repeat count extraction&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Goal ==&lt;br /&gt;
&lt;br /&gt;
Many logic analyzers and file formats support simple stream compression; usually employing some variation of RLE. However, within sigrok logic streams are currently always uncompressed, and a driver for a device with compression has to expand the compressed stream coming from the device before passing it on.&lt;br /&gt;
&lt;br /&gt;
This is not a problem for disk storage, since many of the output modules re-compress the logic stream (e.g. ZIP for the srzip format, or RLE for the VCD format). It is also not a problem if the run lengths for each sample are very short.&lt;br /&gt;
&lt;br /&gt;
However, the worst case behavior is incredibly awful. For instance, with many LAs it is very easy to fill Gigabytes of RAM within seconds, simply by forgetting to turn on the signal source before starting acquisition. It makes for a very bad user experience if a simple mistake like that instantly puts your machine into swap death.&lt;br /&gt;
&lt;br /&gt;
Apart from mistakes that can be made, there are also legitimate reasons to over-sample logic signals -- for instance, if accurate timing information is required.&lt;br /&gt;
&lt;br /&gt;
Even if the RAM is not exhausted, processing will be very slow if streams contain Kilobytes or even Megabytes of consecutive identical samples. This applies to all stages in the processing pipeline, including decoders and display in PulseView.&lt;br /&gt;
&lt;br /&gt;
Therefore, sigrok should support some means of internal stream compression. The compression scheme does not need to be particularly efficient. It should be some form of RLE, to allow easy transcoding from one format to another without having to expand the data. It is not intended to replace srzip compression. However, it would make sense to apply ZIP on top of RLE, in order to avoid having to expand the data at any point.&lt;br /&gt;
&lt;br /&gt;
== Proposed Format ==&lt;br /&gt;
&lt;br /&gt;
Currently, logic data feed packets have a channel count and a unit size in bytes. For the LWLA1034, the channel count is 34 and the unit size is 5. Each sample looks like this:&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;
!Byte 0&lt;br /&gt;
!Byte 1&lt;br /&gt;
!Byte 2&lt;br /&gt;
!Byte 3&lt;br /&gt;
!Byte 4&lt;br /&gt;
|-&lt;br /&gt;
| Ch. 7..0&lt;br /&gt;
| Ch. 15..8&lt;br /&gt;
| Ch. 23..16&lt;br /&gt;
| Ch. 31..24&lt;br /&gt;
| Ch. 33..32&lt;br /&gt;
|}&lt;br /&gt;
The 6 high bits of byte 4 are unused.&lt;br /&gt;
&lt;br /&gt;
This could be extended by introducing another parameter &amp;#039;&amp;#039;repeat count width&amp;#039;&amp;#039;, specifying the number of bits to use for the repeat count. The choice of a good width would be at the discretion of the driver and may vary from one acquisition to another. However, &amp;#039;&amp;#039;channel count&amp;#039;&amp;#039; plus &amp;#039;&amp;#039;repeat count width&amp;#039;&amp;#039; must be not be greater than 8 times the &amp;#039;&amp;#039;unit size&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
As an example, the LWLA1034 driver could specify a &amp;#039;&amp;#039;repeat count width&amp;#039;&amp;#039; of 30, which makes for a nice &amp;#039;&amp;#039;unit size&amp;#039;&amp;#039; of 8 bytes. Each sample would then look like this:&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;
!Byte 0&lt;br /&gt;
!Byte 1&lt;br /&gt;
!Byte 2&lt;br /&gt;
!Byte 3&lt;br /&gt;
!Byte 4&lt;br /&gt;
!Byte 5&lt;br /&gt;
!Byte 6&lt;br /&gt;
!Byte 7&lt;br /&gt;
|-&lt;br /&gt;
| Ch. 7..0&lt;br /&gt;
| Ch. 15..8&lt;br /&gt;
| Ch. 23..16&lt;br /&gt;
| Ch. 31..24&lt;br /&gt;
| Rep. 5..0, Ch. 33..32&lt;br /&gt;
| Rep 13..6&lt;br /&gt;
| Rep 21..14&lt;br /&gt;
| Rep 29..22&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For ease of processing, the repeat count width should be restricted to at most 31 bits, so that it fits into a signed 32-bit integer. For devices that generate larger repeat counts, it is easy enough to split up longer runs on the fly. Also, the repeat count should not be allowed to span more than 4 bytes.&lt;br /&gt;
&lt;br /&gt;
There should be no guarantee that the RLE-encoded stream is minimal. That is, it is legitimate for a driver to produce consecutive identical samples with run lengths less than the maximum. This avoids the need for the driver to carry state from one chunk of data to the next.&lt;br /&gt;
&lt;br /&gt;
The input/output modules should do what is sensible for the format. E.g. the VCD output can just re-use the incoming run lengths without intermediate expansion. The VCD input module should generate RLE-compressed data feeds. The srzip writer should apply ZIP on top on the RLE-compressed data feed.&lt;br /&gt;
&lt;br /&gt;
== API Thoughts ==&lt;br /&gt;
&lt;br /&gt;
In order to make life easy for processing modules and client code, libsigrok should provide helper macros and/or inline functions to deal with RLE data feeds. In particular, there should be a function to extract the repeat count of a sample as an integer. On machines which permit unaligned 32-bit reads (and assuming the &amp;#039;&amp;#039;unit size&amp;#039;&amp;#039; is at least 4), this function could just do a single memory read (and a byte swap on BE machines) followed by a right shift.&lt;br /&gt;
&lt;br /&gt;
An alternative implementation would be to have a fast path if &amp;#039;&amp;#039;unit size&amp;#039;&amp;#039; is divisible by 4 and a generic fallback path doing byte-wise extraction. This variant would never generate unaligned reads (assuming the data feed starts on an aligned address) and needs fewer conditionals.&lt;br /&gt;
&lt;br /&gt;
The channel state extraction does not change from how it works now, except that care has to be taken to mask unused bits in the last channel state byte, if any.&lt;br /&gt;
&lt;br /&gt;
Optionally, an extension to the protocol decoder Python API may allow decoders to process unexpanded RLE data. This could speed up decoding quite significantly in some situations.&lt;/div&gt;</summary>
		<author><name>Danielk</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=User:Danielk/Simple_Internal_Compression_Proposal&amp;diff=10882</id>
		<title>User:Danielk/Simple Internal Compression Proposal</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=User:Danielk/Simple_Internal_Compression_Proposal&amp;diff=10882"/>
		<updated>2015-07-05T12:25:02Z</updated>

		<summary type="html">&lt;p&gt;Danielk: Mention unit size caveat for 32-bit read&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Goal ==&lt;br /&gt;
&lt;br /&gt;
Many logic analyzers and file formats support simple stream compression; usually employing some variation of RLE. However, within sigrok logic streams are currently always uncompressed, and a driver for a device with compression has to expand the compressed stream coming from the device before passing it on.&lt;br /&gt;
&lt;br /&gt;
This is not a problem for disk storage, since many of the output modules re-compress the logic stream (e.g. ZIP for the srzip format, or RLE for the VCD format). It is also not a problem if the run lengths for each sample are very short.&lt;br /&gt;
&lt;br /&gt;
However, the worst case behavior is incredibly awful. For instance, with many LAs it is very easy to fill Gigabytes of RAM within seconds, simply by forgetting to turn on the signal source before starting acquisition. It makes for a very bad user experience if a simple mistake like that instantly puts your machine into swap death.&lt;br /&gt;
&lt;br /&gt;
Apart from mistakes that can be made, there are also legitimate reasons to over-sample logic signals -- for instance, if accurate timing information is required.&lt;br /&gt;
&lt;br /&gt;
Even if the RAM is not exhausted, processing will be very slow if streams contain Kilobytes or even Megabytes of consecutive identical samples. This applies to all stages in the processing pipeline, including decoders and display in PulseView.&lt;br /&gt;
&lt;br /&gt;
Therefore, sigrok should support some means of internal stream compression. The compression scheme does not need to be particularly efficient. It should be some form of RLE, to allow easy transcoding from one format to another without having to expand the data. It is not intended to replace srzip compression. However, it would make sense to apply ZIP on top of RLE, in order to avoid having to expand the data at any point.&lt;br /&gt;
&lt;br /&gt;
== Proposed Format ==&lt;br /&gt;
&lt;br /&gt;
Currently, logic data feed packets have a channel count and a unit size in bytes. For the LWLA1034, the channel count is 34 and the unit size is 5. Each sample looks like this:&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;
!Byte 0&lt;br /&gt;
!Byte 1&lt;br /&gt;
!Byte 2&lt;br /&gt;
!Byte 3&lt;br /&gt;
!Byte 4&lt;br /&gt;
|-&lt;br /&gt;
| Ch. 7..0&lt;br /&gt;
| Ch. 15..8&lt;br /&gt;
| Ch. 23..16&lt;br /&gt;
| Ch. 31..24&lt;br /&gt;
| Ch. 33..32&lt;br /&gt;
|}&lt;br /&gt;
The 6 high bits of byte 4 are unused.&lt;br /&gt;
&lt;br /&gt;
This could be extended by introducing another parameter &amp;#039;&amp;#039;repeat count width&amp;#039;&amp;#039;, specifying the number of bits to use for the repeat count. The choice of a good width would be at the discretion of the driver and may vary from one acquisition to another. However, &amp;#039;&amp;#039;channel count&amp;#039;&amp;#039; plus &amp;#039;&amp;#039;repeat count width&amp;#039;&amp;#039; must be not be greater than 8 times the &amp;#039;&amp;#039;unit size&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
As an example, the LWLA1034 driver could specify a &amp;#039;&amp;#039;repeat count width&amp;#039;&amp;#039; of 30, which makes for a nice &amp;#039;&amp;#039;unit size&amp;#039;&amp;#039; of 8 bytes. Each sample would then look like this:&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;
!Byte 0&lt;br /&gt;
!Byte 1&lt;br /&gt;
!Byte 2&lt;br /&gt;
!Byte 3&lt;br /&gt;
!Byte 4&lt;br /&gt;
!Byte 5&lt;br /&gt;
!Byte 6&lt;br /&gt;
!Byte 7&lt;br /&gt;
|-&lt;br /&gt;
| Ch. 7..0&lt;br /&gt;
| Ch. 15..8&lt;br /&gt;
| Ch. 23..16&lt;br /&gt;
| Ch. 31..24&lt;br /&gt;
| Rep. 5..0, Ch. 33..32&lt;br /&gt;
| Rep 13..6&lt;br /&gt;
| Rep 21..14&lt;br /&gt;
| Rep 29..22&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For ease of processing, the repeat count width should be restricted to at most 31 bits, so that it fits into a signed 32-bit integer. For devices that generate larger repeat counts, it is easy enough to split up longer runs on the fly. Also, the repeat count should not be allowed to span more than 4 bytes.&lt;br /&gt;
&lt;br /&gt;
There should be no guarantee that the RLE-encoded stream is minimal. That is, it is legitimate for a driver to produce consecutive identical samples with run lengths less than the maximum. This avoids the need for the driver to carry state from one chunk of data to the next.&lt;br /&gt;
&lt;br /&gt;
The input/output modules should do what is sensible for the format. E.g. the VCD output can just re-use the incoming run lengths without intermediate expansion. The VCD input module should generate RLE-compressed data feeds. The srzip writer should apply ZIP on top on the RLE-compressed data feed.&lt;br /&gt;
&lt;br /&gt;
== API Thoughts ==&lt;br /&gt;
&lt;br /&gt;
In order to make life easy for processing modules and client code, libsigrok should provide helper macros and/or inline functions to deal with RLE data feeds. In particular, there should be a function to extract the repeat count of a sample as an integer. On machines which permit unaligned 32-bit reads (and assuming the &amp;#039;&amp;#039;unit size&amp;#039;&amp;#039; is at least 4), this function could just do a single memory read (and a byte swap on BE machines) followed by a right shift.&lt;br /&gt;
&lt;br /&gt;
The channel state extraction does not change from how it works now, except that care has to be taken to mask unused bits in the last channel state byte, if any.&lt;br /&gt;
&lt;br /&gt;
Optionally, an extension to the protocol decoder Python API may allow decoders to process unexpanded RLE data. This could speed up decoding quite significantly in some situations.&lt;/div&gt;</summary>
		<author><name>Danielk</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=User:Danielk/Simple_Internal_Compression_Proposal&amp;diff=10881</id>
		<title>User:Danielk/Simple Internal Compression Proposal</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=User:Danielk/Simple_Internal_Compression_Proposal&amp;diff=10881"/>
		<updated>2015-07-05T11:50:21Z</updated>

		<summary type="html">&lt;p&gt;Danielk: Note that the repeat count extractor needs a byte swap on BE machines&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Goal ==&lt;br /&gt;
&lt;br /&gt;
Many logic analyzers and file formats support simple stream compression; usually employing some variation of RLE. However, within sigrok logic streams are currently always uncompressed, and a driver for a device with compression has to expand the compressed stream coming from the device before passing it on.&lt;br /&gt;
&lt;br /&gt;
This is not a problem for disk storage, since many of the output modules re-compress the logic stream (e.g. ZIP for the srzip format, or RLE for the VCD format). It is also not a problem if the run lengths for each sample are very short.&lt;br /&gt;
&lt;br /&gt;
However, the worst case behavior is incredibly awful. For instance, with many LAs it is very easy to fill Gigabytes of RAM within seconds, simply by forgetting to turn on the signal source before starting acquisition. It makes for a very bad user experience if a simple mistake like that instantly puts your machine into swap death.&lt;br /&gt;
&lt;br /&gt;
Apart from mistakes that can be made, there are also legitimate reasons to over-sample logic signals -- for instance, if accurate timing information is required.&lt;br /&gt;
&lt;br /&gt;
Even if the RAM is not exhausted, processing will be very slow if streams contain Kilobytes or even Megabytes of consecutive identical samples. This applies to all stages in the processing pipeline, including decoders and display in PulseView.&lt;br /&gt;
&lt;br /&gt;
Therefore, sigrok should support some means of internal stream compression. The compression scheme does not need to be particularly efficient. It should be some form of RLE, to allow easy transcoding from one format to another without having to expand the data. It is not intended to replace srzip compression. However, it would make sense to apply ZIP on top of RLE, in order to avoid having to expand the data at any point.&lt;br /&gt;
&lt;br /&gt;
== Proposed Format ==&lt;br /&gt;
&lt;br /&gt;
Currently, logic data feed packets have a channel count and a unit size in bytes. For the LWLA1034, the channel count is 34 and the unit size is 5. Each sample looks like this:&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;
!Byte 0&lt;br /&gt;
!Byte 1&lt;br /&gt;
!Byte 2&lt;br /&gt;
!Byte 3&lt;br /&gt;
!Byte 4&lt;br /&gt;
|-&lt;br /&gt;
| Ch. 7..0&lt;br /&gt;
| Ch. 15..8&lt;br /&gt;
| Ch. 23..16&lt;br /&gt;
| Ch. 31..24&lt;br /&gt;
| Ch. 33..32&lt;br /&gt;
|}&lt;br /&gt;
The 6 high bits of byte 4 are unused.&lt;br /&gt;
&lt;br /&gt;
This could be extended by introducing another parameter &amp;#039;&amp;#039;repeat count width&amp;#039;&amp;#039;, specifying the number of bits to use for the repeat count. The choice of a good width would be at the discretion of the driver and may vary from one acquisition to another. However, &amp;#039;&amp;#039;channel count&amp;#039;&amp;#039; plus &amp;#039;&amp;#039;repeat count width&amp;#039;&amp;#039; must be not be greater than 8 times the &amp;#039;&amp;#039;unit size&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
As an example, the LWLA1034 driver could specify a &amp;#039;&amp;#039;repeat count width&amp;#039;&amp;#039; of 30, which makes for a nice &amp;#039;&amp;#039;unit size&amp;#039;&amp;#039; of 8 bytes. Each sample would then look like this:&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;
!Byte 0&lt;br /&gt;
!Byte 1&lt;br /&gt;
!Byte 2&lt;br /&gt;
!Byte 3&lt;br /&gt;
!Byte 4&lt;br /&gt;
!Byte 5&lt;br /&gt;
!Byte 6&lt;br /&gt;
!Byte 7&lt;br /&gt;
|-&lt;br /&gt;
| Ch. 7..0&lt;br /&gt;
| Ch. 15..8&lt;br /&gt;
| Ch. 23..16&lt;br /&gt;
| Ch. 31..24&lt;br /&gt;
| Rep. 5..0, Ch. 33..32&lt;br /&gt;
| Rep 13..6&lt;br /&gt;
| Rep 21..14&lt;br /&gt;
| Rep 29..22&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For ease of processing, the repeat count width should be restricted to at most 31 bits, so that it fits into a signed 32-bit integer. For devices that generate larger repeat counts, it is easy enough to split up longer runs on the fly. Also, the repeat count should not be allowed to span more than 4 bytes.&lt;br /&gt;
&lt;br /&gt;
There should be no guarantee that the RLE-encoded stream is minimal. That is, it is legitimate for a driver to produce consecutive identical samples with run lengths less than the maximum. This avoids the need for the driver to carry state from one chunk of data to the next.&lt;br /&gt;
&lt;br /&gt;
The input/output modules should do what is sensible for the format. E.g. the VCD output can just re-use the incoming run lengths without intermediate expansion. The VCD input module should generate RLE-compressed data feeds. The srzip writer should apply ZIP on top on the RLE-compressed data feed.&lt;br /&gt;
&lt;br /&gt;
== API Thoughts ==&lt;br /&gt;
&lt;br /&gt;
In order to make life easy for processing modules and client code, libsigrok should provide helper macros and/or inline functions to deal with RLE data feeds. In particular, there should be a function to extract the repeat count of a sample as an integer. On machines which permit unaligned 32-bit reads, this function could just do a single memory read (and a byte swap on BE machines) followed by a right shift.&lt;br /&gt;
&lt;br /&gt;
The channel state extraction does not change from how it works now, except that care has to be taken to mask unused bits in the last channel state byte, if any.&lt;br /&gt;
&lt;br /&gt;
Optionally, an extension to the protocol decoder Python API may allow decoders to process unexpanded RLE data. This could speed up decoding quite significantly in some situations.&lt;/div&gt;</summary>
		<author><name>Danielk</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=User:Danielk/Simple_Internal_Compression_Proposal&amp;diff=10880</id>
		<title>User:Danielk/Simple Internal Compression Proposal</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=User:Danielk/Simple_Internal_Compression_Proposal&amp;diff=10880"/>
		<updated>2015-07-05T10:45:50Z</updated>

		<summary type="html">&lt;p&gt;Danielk: Missing word&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Goal ==&lt;br /&gt;
&lt;br /&gt;
Many logic analyzers and file formats support simple stream compression; usually employing some variation of RLE. However, within sigrok logic streams are currently always uncompressed, and a driver for a device with compression has to expand the compressed stream coming from the device before passing it on.&lt;br /&gt;
&lt;br /&gt;
This is not a problem for disk storage, since many of the output modules re-compress the logic stream (e.g. ZIP for the srzip format, or RLE for the VCD format). It is also not a problem if the run lengths for each sample are very short.&lt;br /&gt;
&lt;br /&gt;
However, the worst case behavior is incredibly awful. For instance, with many LAs it is very easy to fill Gigabytes of RAM within seconds, simply by forgetting to turn on the signal source before starting acquisition. It makes for a very bad user experience if a simple mistake like that instantly puts your machine into swap death.&lt;br /&gt;
&lt;br /&gt;
Apart from mistakes that can be made, there are also legitimate reasons to over-sample logic signals -- for instance, if accurate timing information is required.&lt;br /&gt;
&lt;br /&gt;
Even if the RAM is not exhausted, processing will be very slow if streams contain Kilobytes or even Megabytes of consecutive identical samples. This applies to all stages in the processing pipeline, including decoders and display in PulseView.&lt;br /&gt;
&lt;br /&gt;
Therefore, sigrok should support some means of internal stream compression. The compression scheme does not need to be particularly efficient. It should be some form of RLE, to allow easy transcoding from one format to another without having to expand the data. It is not intended to replace srzip compression. However, it would make sense to apply ZIP on top of RLE, in order to avoid having to expand the data at any point.&lt;br /&gt;
&lt;br /&gt;
== Proposed Format ==&lt;br /&gt;
&lt;br /&gt;
Currently, logic data feed packets have a channel count and a unit size in bytes. For the LWLA1034, the channel count is 34 and the unit size is 5. Each sample looks like this:&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;
!Byte 0&lt;br /&gt;
!Byte 1&lt;br /&gt;
!Byte 2&lt;br /&gt;
!Byte 3&lt;br /&gt;
!Byte 4&lt;br /&gt;
|-&lt;br /&gt;
| Ch. 7..0&lt;br /&gt;
| Ch. 15..8&lt;br /&gt;
| Ch. 23..16&lt;br /&gt;
| Ch. 31..24&lt;br /&gt;
| Ch. 33..32&lt;br /&gt;
|}&lt;br /&gt;
The 6 high bits of byte 4 are unused.&lt;br /&gt;
&lt;br /&gt;
This could be extended by introducing another parameter &amp;#039;&amp;#039;repeat count width&amp;#039;&amp;#039;, specifying the number of bits to use for the repeat count. The choice of a good width would be at the discretion of the driver and may vary from one acquisition to another. However, &amp;#039;&amp;#039;channel count&amp;#039;&amp;#039; plus &amp;#039;&amp;#039;repeat count width&amp;#039;&amp;#039; must be not be greater than 8 times the &amp;#039;&amp;#039;unit size&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
As an example, the LWLA1034 driver could specify a &amp;#039;&amp;#039;repeat count width&amp;#039;&amp;#039; of 30, which makes for a nice &amp;#039;&amp;#039;unit size&amp;#039;&amp;#039; of 8 bytes. Each sample would then look like this:&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;
!Byte 0&lt;br /&gt;
!Byte 1&lt;br /&gt;
!Byte 2&lt;br /&gt;
!Byte 3&lt;br /&gt;
!Byte 4&lt;br /&gt;
!Byte 5&lt;br /&gt;
!Byte 6&lt;br /&gt;
!Byte 7&lt;br /&gt;
|-&lt;br /&gt;
| Ch. 7..0&lt;br /&gt;
| Ch. 15..8&lt;br /&gt;
| Ch. 23..16&lt;br /&gt;
| Ch. 31..24&lt;br /&gt;
| Rep. 5..0, Ch. 33..32&lt;br /&gt;
| Rep 13..6&lt;br /&gt;
| Rep 21..14&lt;br /&gt;
| Rep 29..22&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For ease of processing, the repeat count width should be restricted to at most 31 bits, so that it fits into a signed 32-bit integer. For devices that generate larger repeat counts, it is easy enough to split up longer runs on the fly. Also, the repeat count should not be allowed to span more than 4 bytes.&lt;br /&gt;
&lt;br /&gt;
There should be no guarantee that the RLE-encoded stream is minimal. That is, it is legitimate for a driver to produce consecutive identical samples with run lengths less than the maximum. This avoids the need for the driver to carry state from one chunk of data to the next.&lt;br /&gt;
&lt;br /&gt;
The input/output modules should do what is sensible for the format. E.g. the VCD output can just re-use the incoming run lengths without intermediate expansion. The VCD input module should generate RLE-compressed data feeds. The srzip writer should apply ZIP on top on the RLE-compressed data feed.&lt;br /&gt;
&lt;br /&gt;
== API Thoughts ==&lt;br /&gt;
&lt;br /&gt;
In order to make life easy for processing modules and client code, libsigrok should provide helper macros and/or inline functions to deal with RLE data feeds. In particular, there should be a function to extract the repeat count of a sample as an integer. On machines which permit unaligned 32-bit reads, this function could just do a single memory read followed by a right shift.&lt;br /&gt;
&lt;br /&gt;
The channel state extraction does not change from how it works now, except that care has to be taken to mask unused bits in the last channel state byte, if any.&lt;br /&gt;
&lt;br /&gt;
Optionally, an extension to the protocol decoder Python API may allow decoders to process unexpanded RLE data. This could speed up decoding quite significantly in some situations.&lt;/div&gt;</summary>
		<author><name>Danielk</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=User:Danielk/Simple_Internal_Compression_Proposal&amp;diff=10879</id>
		<title>User:Danielk/Simple Internal Compression Proposal</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=User:Danielk/Simple_Internal_Compression_Proposal&amp;diff=10879"/>
		<updated>2015-07-05T10:41:50Z</updated>

		<summary type="html">&lt;p&gt;Danielk: Create compression proposal&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Goal ==&lt;br /&gt;
&lt;br /&gt;
Many logic analyzers and file formats support simple stream compression; usually employing some variation of RLE. However, within sigrok logic streams are currently always uncompressed, and a driver for a device with compression has to expand the compressed stream coming from the device before passing it on.&lt;br /&gt;
&lt;br /&gt;
This is not a problem for disk storage, since many of the output modules re-compress the logic stream (e.g. ZIP for the srzip format, or RLE for the VCD format). It is also not a problem if the run lengths for each sample are very short.&lt;br /&gt;
&lt;br /&gt;
However, the worst case behavior is incredibly awful. For instance, with many LAs it is very easy to fill Gigabytes of RAM within seconds, simply by forgetting to turn on the signal source before starting acquisition. It makes for a very bad user experience if a simple mistake like that instantly puts your machine into swap death.&lt;br /&gt;
&lt;br /&gt;
Apart from mistakes that can be made, there are also legitimate reasons to over-sample logic signals -- for instance, if accurate timing information is required.&lt;br /&gt;
&lt;br /&gt;
Even if the RAM is not exhausted, processing will be very slow if streams contain Kilobytes or even Megabytes of consecutive identical samples. This applies to all stages in the processing pipeline, including decoders and display in PulseView.&lt;br /&gt;
&lt;br /&gt;
Therefore, sigrok should support some means of internal stream compression. The compression scheme does not need to be particularly efficient. It should be some form of RLE, to allow easy transcoding from one format to another without having to expand the data. It is not intended to replace srzip compression. However, it would make sense to apply ZIP on top of RLE, in order to avoid having to expand the data at any point.&lt;br /&gt;
&lt;br /&gt;
== Proposed Format ==&lt;br /&gt;
&lt;br /&gt;
Currently, logic data feed packets have a channel count and a unit size in bytes. For the LWLA1034, the channel count is 34 and the unit size is 5. Each sample looks like this:&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;
!Byte 0&lt;br /&gt;
!Byte 1&lt;br /&gt;
!Byte 2&lt;br /&gt;
!Byte 3&lt;br /&gt;
!Byte 4&lt;br /&gt;
|-&lt;br /&gt;
| Ch. 7..0&lt;br /&gt;
| Ch. 15..8&lt;br /&gt;
| Ch. 23..16&lt;br /&gt;
| Ch. 31..24&lt;br /&gt;
| Ch. 33..32&lt;br /&gt;
|}&lt;br /&gt;
The 6 high bits of byte 4 are unused.&lt;br /&gt;
&lt;br /&gt;
This could be extended by introducing another parameter &amp;#039;&amp;#039;repeat count width&amp;#039;&amp;#039;, specifying the number of bits to use for the repeat count. The choice of a good width would be at the discretion of the driver and may vary from one acquisition to another. However, &amp;#039;&amp;#039;channel count&amp;#039;&amp;#039; plus &amp;#039;&amp;#039;repeat count width&amp;#039;&amp;#039; must be not be greater than 8 times the &amp;#039;&amp;#039;unit size&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
As an example, the LWLA1034 driver could specify a &amp;#039;&amp;#039;repeat count width&amp;#039;&amp;#039; of 30, which makes for a nice &amp;#039;&amp;#039;unit size&amp;#039;&amp;#039; of 8 bytes. Each sample would then look like this:&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;
!Byte 0&lt;br /&gt;
!Byte 1&lt;br /&gt;
!Byte 2&lt;br /&gt;
!Byte 3&lt;br /&gt;
!Byte 4&lt;br /&gt;
!Byte 5&lt;br /&gt;
!Byte 6&lt;br /&gt;
!Byte 7&lt;br /&gt;
|-&lt;br /&gt;
| Ch. 7..0&lt;br /&gt;
| Ch. 15..8&lt;br /&gt;
| Ch. 23..16&lt;br /&gt;
| Ch. 31..24&lt;br /&gt;
| Rep. 5..0, Ch. 33..32&lt;br /&gt;
| Rep 13..6&lt;br /&gt;
| Rep 21..14&lt;br /&gt;
| Rep 29..22&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For ease of processing, the repeat count width should be restricted to at most 31 bits, so that it fits into a signed 32-bit integer. For devices that generate larger repeat counts, it is easy enough to split up longer runs on the fly. Also, the repeat count should not be allowed to span more than 4 bytes.&lt;br /&gt;
&lt;br /&gt;
There should be no guarantee that the RLE-encoded stream is minimal. That is, it is legitimate for a driver to consecutive identical samples with run lengths less than the maximum. This avoids the need for the driver to carry state from one chunk of data to the next.&lt;br /&gt;
&lt;br /&gt;
The input/output modules should do what is sensible for the format. E.g. the VCD output can just re-use the incoming run lengths without intermediate expansion. The VCD input module should generate RLE-compressed data feeds. The srzip writer should apply ZIP on top on the RLE-compressed data feed.&lt;br /&gt;
&lt;br /&gt;
== API Thoughts ==&lt;br /&gt;
&lt;br /&gt;
In order to make life easy for processing modules and client code, libsigrok should provide helper macros and/or inline functions to deal with RLE data feeds. In particular, there should be a function to extract the repeat count of a sample as an integer. On machines which permit unaligned 32-bit reads, this function could just do a single memory read followed by a right shift.&lt;br /&gt;
&lt;br /&gt;
The channel state extraction does not change from how it works now, except that care has to be taken to mask unused bits in the last channel state byte, if any.&lt;br /&gt;
&lt;br /&gt;
Optionally, an extension to the protocol decoder Python API may allow decoders to process unexpanded RLE data. This could speed up decoding quite significantly in some situations.&lt;/div&gt;</summary>
		<author><name>Danielk</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=User:Danielk&amp;diff=10878</id>
		<title>User:Danielk</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=User:Danielk&amp;diff=10878"/>
		<updated>2015-07-05T09:40:49Z</updated>

		<summary type="html">&lt;p&gt;Danielk: Fix link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Hardware TODO list ==&lt;br /&gt;
&lt;br /&gt;
* [[Sysclk LWLA1016]]&lt;br /&gt;
&lt;br /&gt;
== Proposals ==&lt;br /&gt;
&lt;br /&gt;
* [[/Simple Internal Compression Proposal/]]&lt;/div&gt;</summary>
		<author><name>Danielk</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=User:Danielk&amp;diff=10877</id>
		<title>User:Danielk</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=User:Danielk&amp;diff=10877"/>
		<updated>2015-07-05T09:35:56Z</updated>

		<summary type="html">&lt;p&gt;Danielk: Link to compression proposal&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Hardware TODO list ==&lt;br /&gt;
&lt;br /&gt;
* [[Sysclk LWLA1016]]&lt;br /&gt;
&lt;br /&gt;
== Proposals ==&lt;br /&gt;
&lt;br /&gt;
* [[Simple Internal Compression Proposal]]&lt;/div&gt;</summary>
		<author><name>Danielk</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=Sysclk_LWLA1016/Protocol&amp;diff=10876</id>
		<title>Sysclk LWLA1016/Protocol</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=Sysclk_LWLA1016/Protocol&amp;diff=10876"/>
		<updated>2015-07-04T19:34:27Z</updated>

		<summary type="html">&lt;p&gt;Danielk: Describe memory read command and compression scheme&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The basic structure of the SysClk LWLA1016 protocol is similar to the [[Sysclk LWLA1034/Protocol]]. As one would expect, it looks very much like an earlier iteration of the LWLA1034 protocol. It appears to lack the specialized commands the LWLA1034 has for reading memory and capture setup/status. Most of the functionality seems to be implemented on top of basic register reads and writes, using the same commands as the LWLA1034 for those.&lt;br /&gt;
&lt;br /&gt;
== FPGA Configuration ==&lt;br /&gt;
&lt;br /&gt;
As with the LWLA1034, the FPGA bitstream is loaded via bulk transfer to USB end point 4. The format seems to be exactly the same, too.&lt;br /&gt;
&lt;br /&gt;
The Windows software ships four separate executables: One for running with 16 channels at up to 100 MSps, one for 8 channels at up to 200 MSps, and one for 8 channels at 250 MSps. A fourth executable runs the LWLA1016 in frequency counter mode. Each of the executables downloads its own bitstream to the FPGA.&lt;br /&gt;
&lt;br /&gt;
=== Application Behavior ===&lt;br /&gt;
&lt;br /&gt;
The vendor software transfers a new bitstream to the FPGA&lt;br /&gt;
# on application start,&lt;br /&gt;
# ... (TODO).&lt;br /&gt;
&lt;br /&gt;
Selecting specific device configurations may require downloading other bitstream variants to the device. TODO: Make sure all modes are covered.&lt;br /&gt;
&lt;br /&gt;
=== Firmware Extraction ===&lt;br /&gt;
&lt;br /&gt;
The FPGA bitstreams are stored in RBF (Raw Binary File) format, as with the LWLA1034. The bitstreams can be extracted from various DLLs installed with the Windows software (an extraction tool will be provided until we get permission to distribute the firmware). Unfortunately, unlike with the LWLA1034, the LWLA1016 firmware cannot be easily extracted from the installer executable without installing the software first.&lt;br /&gt;
&lt;br /&gt;
There are six different FPGA bitstreams for the various LA modes: 3 frequency modes times 2 compression modes. In the vendor&amp;#039;s terminology, &amp;quot;Timing-State&amp;quot; is the mode with compression enabled and &amp;quot;Normal&amp;quot; is the mode without compression.&lt;br /&gt;
&lt;br /&gt;
== Control Commands ==&lt;br /&gt;
&lt;br /&gt;
As with the LWLA1034, control commands are sent via bulk transfer to USB end point 2, with the response (if any) coming in from end point 6.&lt;br /&gt;
&lt;br /&gt;
For the most part, the LWLA1016 protocol seems to consist of basic register read and write commands. Unlike with the LWLA1034, it looks like capture setup, capture status polling and reading from memory are implemented on top of simple register reads and writes.&lt;br /&gt;
&lt;br /&gt;
=== Command 0001: Read Register ===&lt;br /&gt;
&lt;br /&gt;
Apparently identical to command 1 in the LWLA1034 protocol.&lt;br /&gt;
&lt;br /&gt;
==== Registers ====&lt;br /&gt;
&lt;br /&gt;
Some of the register addresses appearing in the protocol also occur in the LWLA1034 protocol, although it seems that their purpose may not be the same. Other registers appear to be specific to the LWLA1016.&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;
!Address&lt;br /&gt;
!Value&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
| 1010&lt;br /&gt;
| ???&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 1070&lt;br /&gt;
| ???&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 107C&lt;br /&gt;
| ???&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 10B0&lt;br /&gt;
| ???&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 10B4&lt;br /&gt;
| ???&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 10B8&lt;br /&gt;
| ???&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 10BC&lt;br /&gt;
| 0x1234xxxx&lt;br /&gt;
| The lower 16 bit appear to be the live channel state&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Command 0002: Write Register ===&lt;br /&gt;
&lt;br /&gt;
Apparently identical to command 2 in the LWLA1034 protocol.&lt;br /&gt;
&lt;br /&gt;
==== Registers ====&lt;br /&gt;
&lt;br /&gt;
Some of the register addresses appearing in the protocol also occur in the LWLA1034 protocol, although it seems that their purpose may not be the same. Other registers appear to be specific to the LWLA1016.&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;
!Address&lt;br /&gt;
!Value&lt;br /&gt;
|-&lt;br /&gt;
| 1000&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 1010&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 107C&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 10B0&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 10B4&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 10B8&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 10BC&lt;br /&gt;
| ???&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Command 0003: Read Memory at Address ===&lt;br /&gt;
&lt;br /&gt;
This command reads something from the device. It does not occur in the LWLA1034 protocol.&lt;br /&gt;
&lt;br /&gt;
==== Command ====&lt;br /&gt;
&lt;br /&gt;
Fixed length of 5 words (10 bytes).&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;
!ID&lt;br /&gt;
!Address&lt;br /&gt;
!Length&lt;br /&gt;
|-&lt;br /&gt;
| 0003&lt;br /&gt;
| aaaa-aaaa&lt;br /&gt;
| nnnn-nnnn&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Both the address and the length are encoded in mixed endian (2-1-4-3) byte order.&lt;br /&gt;
&lt;br /&gt;
==== Response ====&lt;br /&gt;
&lt;br /&gt;
The memory is 32 bit wide, and thus the size of the response in bits is 32 times the value in the length field. The original vendor software reads chunks of 250 words @ 32 bit at a time, i.e. 1000 bytes. Note that the software always starts reading at address 2 rather than 0.&lt;br /&gt;
&lt;br /&gt;
===== Compression Scheme =====&lt;br /&gt;
&lt;br /&gt;
In timing-state mode a very simple form of run-length encoding is used. Each 32-bit unit of memory holds 2 Little Endian values. The 16-bit word  at the lower address is the repeat count for the channel state encoded in the subsequent 16-bit word.&lt;br /&gt;
&lt;br /&gt;
=== Command 0005: Write ??? ===&lt;br /&gt;
&lt;br /&gt;
This command appears to have the same format and function as command 5 sent by the original LWLA1034 firmware. That means we can probably ignore it, just as with the LWLA1034.&lt;br /&gt;
&lt;br /&gt;
==== Command ====&lt;br /&gt;
&lt;br /&gt;
Fixed length of 33 words (66 bytes).&lt;br /&gt;
&lt;br /&gt;
== Task Recipes ==&lt;br /&gt;
&lt;br /&gt;
This section lists the commands issued by the software to perform a particular task.&lt;br /&gt;
&lt;br /&gt;
=== Initialization ===&lt;br /&gt;
&lt;br /&gt;
# Acquire control of USB device and select configuration 1&lt;br /&gt;
# Send FPGA bitstream to EP 4 via bulk transfer&lt;br /&gt;
# Initial register activity:&lt;br /&gt;
## Read register 0x10B4, expected reply is 0x12345678&lt;br /&gt;
## Read register 0x10B4 (again), expected reply is 0x12345678&lt;br /&gt;
## Send command 5, which seems to have the same format and payload as with the LWLA1034&lt;br /&gt;
&lt;br /&gt;
=== Device State Polling ===&lt;br /&gt;
&lt;br /&gt;
# Read register 0x10B8, reply is 0x10 in timing-state mode, or 0 in normal mode&lt;br /&gt;
# Read register 0x10B0, reply is 0&lt;br /&gt;
# Read register 0x1070, reply is 0&lt;br /&gt;
# Read register 0x10BC, reply is 0x1234xxxx, where &amp;quot;xxxx&amp;quot; is the channel state&lt;br /&gt;
# Read register 0x1010, reply is 0&lt;/div&gt;</summary>
		<author><name>Danielk</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=Sysclk_LWLA1016/Protocol&amp;diff=10875</id>
		<title>Sysclk LWLA1016/Protocol</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=Sysclk_LWLA1016/Protocol&amp;diff=10875"/>
		<updated>2015-07-04T18:49:11Z</updated>

		<summary type="html">&lt;p&gt;Danielk: Add detail on 0x10B8 polling&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The basic structure of the SysClk LWLA1016 protocol is similar to the [[Sysclk LWLA1034/Protocol]]. As one would expect, it looks very much like an earlier iteration of the LWLA1034 protocol. It appears to lack the specialized commands the LWLA1034 has for reading memory and capture setup/status. Most of the functionality seems to be implemented on top of basic register reads and writes, using the same commands as the LWLA1034 for those.&lt;br /&gt;
&lt;br /&gt;
== FPGA Configuration ==&lt;br /&gt;
&lt;br /&gt;
As with the LWLA1034, the FPGA bitstream is loaded via bulk transfer to USB end point 4. The format seems to be exactly the same, too.&lt;br /&gt;
&lt;br /&gt;
The Windows software ships four separate executables: One for running with 16 channels at up to 100 MSps, one for 8 channels at up to 200 MSps, and one for 8 channels at 250 MSps. A fourth executable runs the LWLA1016 in frequency counter mode. Each of the executables downloads its own bitstream to the FPGA.&lt;br /&gt;
&lt;br /&gt;
=== Application Behavior ===&lt;br /&gt;
&lt;br /&gt;
The vendor software transfers a new bitstream to the FPGA&lt;br /&gt;
# on application start,&lt;br /&gt;
# ... (TODO).&lt;br /&gt;
&lt;br /&gt;
Selecting specific device configurations may require downloading other bitstream variants to the device. TODO: Make sure all modes are covered.&lt;br /&gt;
&lt;br /&gt;
=== Firmware Extraction ===&lt;br /&gt;
&lt;br /&gt;
The FPGA bitstreams are stored in RBF (Raw Binary File) format, as with the LWLA1034. The bitstreams can be extracted from various DLLs installed with the Windows software (an extraction tool will be provided until we get permission to distribute the firmware). Unfortunately, unlike with the LWLA1034, the LWLA1016 firmware cannot be easily extracted from the installer executable without installing the software first.&lt;br /&gt;
&lt;br /&gt;
There are six different FPGA bitstreams for the various LA modes: 3 frequency modes times 2 compression modes. In the vendor&amp;#039;s terminology, &amp;quot;Timing-State&amp;quot; is the mode with compression enabled and &amp;quot;Normal&amp;quot; is the mode without compression.&lt;br /&gt;
&lt;br /&gt;
== Control Commands ==&lt;br /&gt;
&lt;br /&gt;
As with the LWLA1034, control commands are sent via bulk transfer to USB end point 2, with the response (if any) coming in from end point 6.&lt;br /&gt;
&lt;br /&gt;
For the most part, the LWLA1016 protocol seems to consist of basic register read and write commands. Unlike with the LWLA1034, it looks like capture setup, capture status polling and reading from memory are implemented on top of simple register reads and writes.&lt;br /&gt;
&lt;br /&gt;
=== Command 0001: Read Register ===&lt;br /&gt;
&lt;br /&gt;
Apparently identical to command 1 in the LWLA1034 protocol.&lt;br /&gt;
&lt;br /&gt;
==== Registers ====&lt;br /&gt;
&lt;br /&gt;
Some of the register addresses appearing in the protocol also occur in the LWLA1034 protocol, although it seems that their purpose may not be the same. Other registers appear to be specific to the LWLA1016.&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;
!Address&lt;br /&gt;
!Value&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
| 1010&lt;br /&gt;
| ???&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 1070&lt;br /&gt;
| ???&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 107C&lt;br /&gt;
| ???&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 10B0&lt;br /&gt;
| ???&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 10B4&lt;br /&gt;
| ???&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 10B8&lt;br /&gt;
| ???&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 10BC&lt;br /&gt;
| 0x1234xxxx&lt;br /&gt;
| The lower 16 bit appear to be the live channel state&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Command 0002: Write Register ===&lt;br /&gt;
&lt;br /&gt;
Apparently identical to command 2 in the LWLA1034 protocol.&lt;br /&gt;
&lt;br /&gt;
==== Registers ====&lt;br /&gt;
&lt;br /&gt;
Some of the register addresses appearing in the protocol also occur in the LWLA1034 protocol, although it seems that their purpose may not be the same. Other registers appear to be specific to the LWLA1016.&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;
!Address&lt;br /&gt;
!Value&lt;br /&gt;
|-&lt;br /&gt;
| 1000&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 1010&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 107C&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 10B0&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 10B4&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 10B8&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 10BC&lt;br /&gt;
| ???&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Command 0003: Read ??? ===&lt;br /&gt;
&lt;br /&gt;
This command reads something from the device. It does not occur in the LWLA1034 protocol.&lt;br /&gt;
&lt;br /&gt;
==== Command ====&lt;br /&gt;
&lt;br /&gt;
Fixed (?) length of 4 words (8 bytes).&lt;br /&gt;
&lt;br /&gt;
==== Response ====&lt;br /&gt;
&lt;br /&gt;
The response to the command as sent by the vendor software consists of 8 words (16 bytes).&lt;br /&gt;
&lt;br /&gt;
=== Command 0005: Write ??? ===&lt;br /&gt;
&lt;br /&gt;
This command appears to have the same format and function as command 5 sent by the original LWLA1034 firmware. That means we can probably ignore it, just as with the LWLA1034.&lt;br /&gt;
&lt;br /&gt;
==== Command ====&lt;br /&gt;
&lt;br /&gt;
Fixed length of 33 words (66 bytes).&lt;br /&gt;
&lt;br /&gt;
== Task Recipes ==&lt;br /&gt;
&lt;br /&gt;
This section lists the commands issued by the software to perform a particular task.&lt;br /&gt;
&lt;br /&gt;
=== Initialization ===&lt;br /&gt;
&lt;br /&gt;
# Acquire control of USB device and select configuration 1&lt;br /&gt;
# Send FPGA bitstream to EP 4 via bulk transfer&lt;br /&gt;
# Initial register activity:&lt;br /&gt;
## Read register 0x10B4, expected reply is 0x12345678&lt;br /&gt;
## Read register 0x10B4 (again), expected reply is 0x12345678&lt;br /&gt;
## Send command 5, which seems to have the same format and payload as with the LWLA1034&lt;br /&gt;
&lt;br /&gt;
=== Device State Polling ===&lt;br /&gt;
&lt;br /&gt;
# Read register 0x10B8, reply is 0x10 in timing-state mode, or 0 in normal mode&lt;br /&gt;
# Read register 0x10B0, reply is 0&lt;br /&gt;
# Read register 0x1070, reply is 0&lt;br /&gt;
# Read register 0x10BC, reply is 0x1234xxxx, where &amp;quot;xxxx&amp;quot; is the channel state&lt;br /&gt;
# Read register 0x1010, reply is 0&lt;/div&gt;</summary>
		<author><name>Danielk</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=Sysclk_LWLA1016/Protocol&amp;diff=10874</id>
		<title>Sysclk LWLA1016/Protocol</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=Sysclk_LWLA1016/Protocol&amp;diff=10874"/>
		<updated>2015-07-04T18:23:41Z</updated>

		<summary type="html">&lt;p&gt;Danielk: Add info on device state polling&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The basic structure of the SysClk LWLA1016 protocol is similar to the [[Sysclk LWLA1034/Protocol]]. As one would expect, it looks very much like an earlier iteration of the LWLA1034 protocol. It appears to lack the specialized commands the LWLA1034 has for reading memory and capture setup/status. Most of the functionality seems to be implemented on top of basic register reads and writes, using the same commands as the LWLA1034 for those.&lt;br /&gt;
&lt;br /&gt;
== FPGA Configuration ==&lt;br /&gt;
&lt;br /&gt;
As with the LWLA1034, the FPGA bitstream is loaded via bulk transfer to USB end point 4. The format seems to be exactly the same, too.&lt;br /&gt;
&lt;br /&gt;
The Windows software ships four separate executables: One for running with 16 channels at up to 100 MSps, one for 8 channels at up to 200 MSps, and one for 8 channels at 250 MSps. A fourth executable runs the LWLA1016 in frequency counter mode. Each of the executables downloads its own bitstream to the FPGA.&lt;br /&gt;
&lt;br /&gt;
=== Application Behavior ===&lt;br /&gt;
&lt;br /&gt;
The vendor software transfers a new bitstream to the FPGA&lt;br /&gt;
# on application start,&lt;br /&gt;
# ... (TODO).&lt;br /&gt;
&lt;br /&gt;
Selecting specific device configurations may require downloading other bitstream variants to the device. TODO: Make sure all modes are covered.&lt;br /&gt;
&lt;br /&gt;
=== Firmware Extraction ===&lt;br /&gt;
&lt;br /&gt;
The FPGA bitstreams are stored in RBF (Raw Binary File) format, as with the LWLA1034. The bitstreams can be extracted from various DLLs installed with the Windows software (an extraction tool will be provided until we get permission to distribute the firmware). Unfortunately, unlike with the LWLA1034, the LWLA1016 firmware cannot be easily extracted from the installer executable without installing the software first.&lt;br /&gt;
&lt;br /&gt;
There are six different FPGA bitstreams for the various LA modes: 3 frequency modes times 2 compression modes. In the vendor&amp;#039;s terminology, &amp;quot;Timing-State&amp;quot; is the mode with compression enabled and &amp;quot;Normal&amp;quot; is the mode without compression.&lt;br /&gt;
&lt;br /&gt;
== Control Commands ==&lt;br /&gt;
&lt;br /&gt;
As with the LWLA1034, control commands are sent via bulk transfer to USB end point 2, with the response (if any) coming in from end point 6.&lt;br /&gt;
&lt;br /&gt;
For the most part, the LWLA1016 protocol seems to consist of basic register read and write commands. Unlike with the LWLA1034, it looks like capture setup, capture status polling and reading from memory are implemented on top of simple register reads and writes.&lt;br /&gt;
&lt;br /&gt;
=== Command 0001: Read Register ===&lt;br /&gt;
&lt;br /&gt;
Apparently identical to command 1 in the LWLA1034 protocol.&lt;br /&gt;
&lt;br /&gt;
==== Registers ====&lt;br /&gt;
&lt;br /&gt;
Some of the register addresses appearing in the protocol also occur in the LWLA1034 protocol, although it seems that their purpose may not be the same. Other registers appear to be specific to the LWLA1016.&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;
!Address&lt;br /&gt;
!Value&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
| 1010&lt;br /&gt;
| ???&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 1070&lt;br /&gt;
| ???&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 107C&lt;br /&gt;
| ???&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 10B0&lt;br /&gt;
| ???&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 10B4&lt;br /&gt;
| ???&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 10B8&lt;br /&gt;
| ???&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 10BC&lt;br /&gt;
| 0x1234xxxx&lt;br /&gt;
| The lower 16 bit appear to be the live channel state&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Command 0002: Write Register ===&lt;br /&gt;
&lt;br /&gt;
Apparently identical to command 2 in the LWLA1034 protocol.&lt;br /&gt;
&lt;br /&gt;
==== Registers ====&lt;br /&gt;
&lt;br /&gt;
Some of the register addresses appearing in the protocol also occur in the LWLA1034 protocol, although it seems that their purpose may not be the same. Other registers appear to be specific to the LWLA1016.&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;
!Address&lt;br /&gt;
!Value&lt;br /&gt;
|-&lt;br /&gt;
| 1000&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 1010&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 107C&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 10B0&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 10B4&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 10B8&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 10BC&lt;br /&gt;
| ???&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Command 0003: Read ??? ===&lt;br /&gt;
&lt;br /&gt;
This command reads something from the device. It does not occur in the LWLA1034 protocol.&lt;br /&gt;
&lt;br /&gt;
==== Command ====&lt;br /&gt;
&lt;br /&gt;
Fixed (?) length of 4 words (8 bytes).&lt;br /&gt;
&lt;br /&gt;
==== Response ====&lt;br /&gt;
&lt;br /&gt;
The response to the command as sent by the vendor software consists of 8 words (16 bytes).&lt;br /&gt;
&lt;br /&gt;
=== Command 0005: Write ??? ===&lt;br /&gt;
&lt;br /&gt;
This command appears to have the same format and function as command 5 sent by the original LWLA1034 firmware. That means we can probably ignore it, just as with the LWLA1034.&lt;br /&gt;
&lt;br /&gt;
==== Command ====&lt;br /&gt;
&lt;br /&gt;
Fixed length of 33 words (66 bytes).&lt;br /&gt;
&lt;br /&gt;
== Task Recipes ==&lt;br /&gt;
&lt;br /&gt;
This section lists the commands issued by the software to perform a particular task.&lt;br /&gt;
&lt;br /&gt;
=== Initialization ===&lt;br /&gt;
&lt;br /&gt;
# Acquire control of USB device and select configuration 1&lt;br /&gt;
# Send FPGA bitstream to EP 4 via bulk transfer&lt;br /&gt;
# Initial register activity:&lt;br /&gt;
## Read register 0x10B4, expected reply is 0x12345678&lt;br /&gt;
## Read register 0x10B4 (again), expected reply is 0x12345678&lt;br /&gt;
## Send command 5, which seems to have the same format and payload as with the LWLA1034&lt;br /&gt;
&lt;br /&gt;
=== Device State Polling ===&lt;br /&gt;
&lt;br /&gt;
# Read register 0x10B8, reply is 0x10&lt;br /&gt;
# Read register 0x10B0, reply is 0&lt;br /&gt;
# Read register 0x1070, reply is 0&lt;br /&gt;
# Read register 0x10BC, reply is 0x1234xxxx, where &amp;quot;xxxx&amp;quot; is the channel state&lt;br /&gt;
# Read register 0x1010, reply is 0&lt;/div&gt;</summary>
		<author><name>Danielk</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=Sysclk_LWLA1016/Protocol&amp;diff=10873</id>
		<title>Sysclk LWLA1016/Protocol</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=Sysclk_LWLA1016/Protocol&amp;diff=10873"/>
		<updated>2015-07-04T18:17:11Z</updated>

		<summary type="html">&lt;p&gt;Danielk: Elaborate on the 6 bitstreams&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The basic structure of the SysClk LWLA1016 protocol is similar to the [[Sysclk LWLA1034/Protocol]]. As one would expect, it looks very much like an earlier iteration of the LWLA1034 protocol. It appears to lack the specialized commands the LWLA1034 has for reading memory and capture setup/status. Most of the functionality seems to be implemented on top of basic register reads and writes, using the same commands as the LWLA1034 for those.&lt;br /&gt;
&lt;br /&gt;
== FPGA Configuration ==&lt;br /&gt;
&lt;br /&gt;
As with the LWLA1034, the FPGA bitstream is loaded via bulk transfer to USB end point 4. The format seems to be exactly the same, too.&lt;br /&gt;
&lt;br /&gt;
The Windows software ships four separate executables: One for running with 16 channels at up to 100 MSps, one for 8 channels at up to 200 MSps, and one for 8 channels at 250 MSps. A fourth executable runs the LWLA1016 in frequency counter mode. Each of the executables downloads its own bitstream to the FPGA.&lt;br /&gt;
&lt;br /&gt;
=== Application Behavior ===&lt;br /&gt;
&lt;br /&gt;
The vendor software transfers a new bitstream to the FPGA&lt;br /&gt;
# on application start,&lt;br /&gt;
# ... (TODO).&lt;br /&gt;
&lt;br /&gt;
Selecting specific device configurations may require downloading other bitstream variants to the device. TODO: Make sure all modes are covered.&lt;br /&gt;
&lt;br /&gt;
=== Firmware Extraction ===&lt;br /&gt;
&lt;br /&gt;
The FPGA bitstreams are stored in RBF (Raw Binary File) format, as with the LWLA1034. The bitstreams can be extracted from various DLLs installed with the Windows software (an extraction tool will be provided until we get permission to distribute the firmware). Unfortunately, unlike with the LWLA1034, the LWLA1016 firmware cannot be easily extracted from the installer executable without installing the software first.&lt;br /&gt;
&lt;br /&gt;
There are six different FPGA bitstreams for the various LA modes: 3 frequency modes times 2 compression modes. In the vendor&amp;#039;s terminology, &amp;quot;Timing-State&amp;quot; is the mode with compression enabled and &amp;quot;Normal&amp;quot; is the mode without compression.&lt;br /&gt;
&lt;br /&gt;
== Control Commands ==&lt;br /&gt;
&lt;br /&gt;
As with the LWLA1034, control commands are sent via bulk transfer to USB end point 2, with the response (if any) coming in from end point 6.&lt;br /&gt;
&lt;br /&gt;
For the most part, the LWLA1016 protocol seems to consist of basic register read and write commands. Unlike with the LWLA1034, it looks like capture setup, capture status polling and reading from memory are implemented on top of simple register reads and writes.&lt;br /&gt;
&lt;br /&gt;
=== Command 0001: Read Register ===&lt;br /&gt;
&lt;br /&gt;
Apparently identical to command 1 in the LWLA1034 protocol.&lt;br /&gt;
&lt;br /&gt;
==== Registers ====&lt;br /&gt;
&lt;br /&gt;
Some of the register addresses appearing in the protocol also occur in the LWLA1034 protocol, although it seems that their purpose may not be the same. Other registers appear to be specific to the LWLA1016.&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;
!Address&lt;br /&gt;
!Value&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
| 1010&lt;br /&gt;
| ???&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 1070&lt;br /&gt;
| ???&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 107C&lt;br /&gt;
| ???&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 10B0&lt;br /&gt;
| ???&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 10B4&lt;br /&gt;
| ???&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 10B8&lt;br /&gt;
| ???&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 10BC&lt;br /&gt;
| 0x1234xxxx&lt;br /&gt;
| The lower 16 bit appear to be the live channel state&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Command 0002: Write Register ===&lt;br /&gt;
&lt;br /&gt;
Apparently identical to command 2 in the LWLA1034 protocol.&lt;br /&gt;
&lt;br /&gt;
==== Registers ====&lt;br /&gt;
&lt;br /&gt;
Some of the register addresses appearing in the protocol also occur in the LWLA1034 protocol, although it seems that their purpose may not be the same. Other registers appear to be specific to the LWLA1016.&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;
!Address&lt;br /&gt;
!Value&lt;br /&gt;
|-&lt;br /&gt;
| 1000&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 1010&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 107C&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 10B0&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 10B4&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 10B8&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 10BC&lt;br /&gt;
| ???&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Command 0003: Read ??? ===&lt;br /&gt;
&lt;br /&gt;
This command reads something from the device. It does not occur in the LWLA1034 protocol.&lt;br /&gt;
&lt;br /&gt;
==== Command ====&lt;br /&gt;
&lt;br /&gt;
Fixed (?) length of 4 words (8 bytes).&lt;br /&gt;
&lt;br /&gt;
==== Response ====&lt;br /&gt;
&lt;br /&gt;
The response to the command as sent by the vendor software consists of 8 words (16 bytes).&lt;br /&gt;
&lt;br /&gt;
=== Command 0005: Write ??? ===&lt;br /&gt;
&lt;br /&gt;
This command appears to have the same format and function as command 5 sent by the original LWLA1034 firmware. That means we can probably ignore it, just as with the LWLA1034.&lt;br /&gt;
&lt;br /&gt;
==== Command ====&lt;br /&gt;
&lt;br /&gt;
Fixed length of 33 words (66 bytes).&lt;br /&gt;
&lt;br /&gt;
== Task Recipes ==&lt;br /&gt;
&lt;br /&gt;
This section lists the commands issued by the software to perform a particular task.&lt;br /&gt;
&lt;br /&gt;
=== Initialization ===&lt;br /&gt;
&lt;br /&gt;
# Acquire control of USB device and select configuration 1&lt;br /&gt;
# Send FPGA bitstream to EP 4 via bulk transfer&lt;br /&gt;
# Initial register activity:&lt;br /&gt;
## Read register 0x10B4, expected reply is 0x12345678&lt;br /&gt;
## Read register 0x10B4 (again), expected reply is 0x12345678&lt;br /&gt;
## Send command 5, which seems to have the same format and payload as with the LWLA1034&lt;br /&gt;
## Read register 0x10B8, reply is 0x10&lt;br /&gt;
## Read register 0x10B0, reply is 0&lt;br /&gt;
## Read register 0x1070, reply is 0&lt;br /&gt;
## Read register 0x10BC, reply is 0x12340000&lt;br /&gt;
## Read register 0x1010, reply is 0&lt;br /&gt;
## Read register 0x10B8, reply is 0x10&lt;br /&gt;
## ...&lt;/div&gt;</summary>
		<author><name>Danielk</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=Sysclk_LWLA1016/Protocol&amp;diff=10872</id>
		<title>Sysclk LWLA1016/Protocol</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=Sysclk_LWLA1016/Protocol&amp;diff=10872"/>
		<updated>2015-07-04T16:44:21Z</updated>

		<summary type="html">&lt;p&gt;Danielk: Expand on reg 10BC&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The basic structure of the SysClk LWLA1016 protocol is similar to the [[Sysclk LWLA1034/Protocol]]. As one would expect, it looks very much like an earlier iteration of the LWLA1034 protocol. It appears to lack the specialized commands the LWLA1034 has for reading memory and capture setup/status. Most of the functionality seems to be implemented on top of basic register reads and writes, using the same commands as the LWLA1034 for those.&lt;br /&gt;
&lt;br /&gt;
== FPGA Configuration ==&lt;br /&gt;
&lt;br /&gt;
As with the LWLA1034, the FPGA bitstream is loaded via bulk transfer to USB end point 4. The format seems to be exactly the same, too.&lt;br /&gt;
&lt;br /&gt;
The Windows software ships four separate executables: One for running with 16 channels at up to 100 MSps, one for 8 channels at up to 200 MSps, and one for 8 channels at 250 MSps. A fourth executable runs the LWLA1016 in frequency counter mode. Each of the executables downloads its own bitstream to the FPGA.&lt;br /&gt;
&lt;br /&gt;
=== Application Behavior ===&lt;br /&gt;
&lt;br /&gt;
The vendor software transfers a new bitstream to the FPGA&lt;br /&gt;
# on application start,&lt;br /&gt;
# ... (TODO).&lt;br /&gt;
&lt;br /&gt;
Selecting specific device configurations may require downloading other bitstream variants to the device. TODO: Make sure all modes are covered.&lt;br /&gt;
&lt;br /&gt;
=== Firmware Extraction ===&lt;br /&gt;
&lt;br /&gt;
The FPGA bitstreams are stored in RBF (Raw Binary File) format, as with the LWLA1034. The bitstreams can be extracted from various DLLs installed with the Windows software (an extraction tool will be provided until we get permission to distribute the firmware). Unfortunately, unlike with the LWLA1034, the LWLA1016 firmware cannot be easily extracted from the installer executable without installing the software first.&lt;br /&gt;
&lt;br /&gt;
== Control Commands ==&lt;br /&gt;
&lt;br /&gt;
As with the LWLA1034, control commands are sent via bulk transfer to USB end point 2, with the response (if any) coming in from end point 6.&lt;br /&gt;
&lt;br /&gt;
For the most part, the LWLA1016 protocol seems to consist of basic register read and write commands. Unlike with the LWLA1034, it looks like capture setup, capture status polling and reading from memory are implemented on top of simple register reads and writes.&lt;br /&gt;
&lt;br /&gt;
=== Command 0001: Read Register ===&lt;br /&gt;
&lt;br /&gt;
Apparently identical to command 1 in the LWLA1034 protocol.&lt;br /&gt;
&lt;br /&gt;
==== Registers ====&lt;br /&gt;
&lt;br /&gt;
Some of the register addresses appearing in the protocol also occur in the LWLA1034 protocol, although it seems that their purpose may not be the same. Other registers appear to be specific to the LWLA1016.&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;
!Address&lt;br /&gt;
!Value&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
| 1010&lt;br /&gt;
| ???&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 1070&lt;br /&gt;
| ???&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 107C&lt;br /&gt;
| ???&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 10B0&lt;br /&gt;
| ???&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 10B4&lt;br /&gt;
| ???&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 10B8&lt;br /&gt;
| ???&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 10BC&lt;br /&gt;
| 0x1234xxxx&lt;br /&gt;
| The lower 16 bit appear to be the live channel state&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Command 0002: Write Register ===&lt;br /&gt;
&lt;br /&gt;
Apparently identical to command 2 in the LWLA1034 protocol.&lt;br /&gt;
&lt;br /&gt;
==== Registers ====&lt;br /&gt;
&lt;br /&gt;
Some of the register addresses appearing in the protocol also occur in the LWLA1034 protocol, although it seems that their purpose may not be the same. Other registers appear to be specific to the LWLA1016.&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;
!Address&lt;br /&gt;
!Value&lt;br /&gt;
|-&lt;br /&gt;
| 1000&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 1010&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 107C&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 10B0&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 10B4&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 10B8&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 10BC&lt;br /&gt;
| ???&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Command 0003: Read ??? ===&lt;br /&gt;
&lt;br /&gt;
This command reads something from the device. It does not occur in the LWLA1034 protocol.&lt;br /&gt;
&lt;br /&gt;
==== Command ====&lt;br /&gt;
&lt;br /&gt;
Fixed (?) length of 4 words (8 bytes).&lt;br /&gt;
&lt;br /&gt;
==== Response ====&lt;br /&gt;
&lt;br /&gt;
The response to the command as sent by the vendor software consists of 8 words (16 bytes).&lt;br /&gt;
&lt;br /&gt;
=== Command 0005: Write ??? ===&lt;br /&gt;
&lt;br /&gt;
This command appears to have the same format and function as command 5 sent by the original LWLA1034 firmware. That means we can probably ignore it, just as with the LWLA1034.&lt;br /&gt;
&lt;br /&gt;
==== Command ====&lt;br /&gt;
&lt;br /&gt;
Fixed length of 33 words (66 bytes).&lt;br /&gt;
&lt;br /&gt;
== Task Recipes ==&lt;br /&gt;
&lt;br /&gt;
This section lists the commands issued by the software to perform a particular task.&lt;br /&gt;
&lt;br /&gt;
=== Initialization ===&lt;br /&gt;
&lt;br /&gt;
# Acquire control of USB device and select configuration 1&lt;br /&gt;
# Send FPGA bitstream to EP 4 via bulk transfer&lt;br /&gt;
# Initial register activity:&lt;br /&gt;
## Read register 0x10B4, expected reply is 0x12345678&lt;br /&gt;
## Read register 0x10B4 (again), expected reply is 0x12345678&lt;br /&gt;
## Send command 5, which seems to have the same format and payload as with the LWLA1034&lt;br /&gt;
## Read register 0x10B8, reply is 0x10&lt;br /&gt;
## Read register 0x10B0, reply is 0&lt;br /&gt;
## Read register 0x1070, reply is 0&lt;br /&gt;
## Read register 0x10BC, reply is 0x12340000&lt;br /&gt;
## Read register 0x1010, reply is 0&lt;br /&gt;
## Read register 0x10B8, reply is 0x10&lt;br /&gt;
## ...&lt;/div&gt;</summary>
		<author><name>Danielk</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=Sysclk_LWLA1016/Protocol&amp;diff=10870</id>
		<title>Sysclk LWLA1016/Protocol</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=Sysclk_LWLA1016/Protocol&amp;diff=10870"/>
		<updated>2015-07-02T17:59:28Z</updated>

		<summary type="html">&lt;p&gt;Danielk: Mention command 5&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The basic structure of the SysClk LWLA1016 protocol is similar to the [[Sysclk LWLA1034/Protocol]]. As one would expect, it looks very much like an earlier iteration of the LWLA1034 protocol. It appears to lack the specialized commands the LWLA1034 has for reading memory and capture setup/status. Most of the functionality seems to be implemented on top of basic register reads and writes, using the same commands as the LWLA1034 for those.&lt;br /&gt;
&lt;br /&gt;
== FPGA Configuration ==&lt;br /&gt;
&lt;br /&gt;
As with the LWLA1034, the FPGA bitstream is loaded via bulk transfer to USB end point 4. The format seems to be exactly the same, too.&lt;br /&gt;
&lt;br /&gt;
The Windows software ships four separate executables: One for running with 16 channels at up to 100 MSps, one for 8 channels at up to 200 MSps, and one for 8 channels at 250 MSps. A fourth executable runs the LWLA1016 in frequency counter mode. Each of the executables downloads its own bitstream to the FPGA.&lt;br /&gt;
&lt;br /&gt;
=== Application Behavior ===&lt;br /&gt;
&lt;br /&gt;
The vendor software transfers a new bitstream to the FPGA&lt;br /&gt;
# on application start,&lt;br /&gt;
# ... (TODO).&lt;br /&gt;
&lt;br /&gt;
Selecting specific device configurations may require downloading other bitstream variants to the device. TODO: Make sure all modes are covered.&lt;br /&gt;
&lt;br /&gt;
=== Firmware Extraction ===&lt;br /&gt;
&lt;br /&gt;
The FPGA bitstreams are stored in RBF (Raw Binary File) format, as with the LWLA1034. The bitstreams can be extracted from various DLLs installed with the Windows software (an extraction tool will be provided until we get permission to distribute the firmware). Unfortunately, unlike with the LWLA1034, the LWLA1016 firmware cannot be easily extracted from the installer executable without installing the software first.&lt;br /&gt;
&lt;br /&gt;
== Control Commands ==&lt;br /&gt;
&lt;br /&gt;
As with the LWLA1034, control commands are sent via bulk transfer to USB end point 2, with the response (if any) coming in from end point 6.&lt;br /&gt;
&lt;br /&gt;
For the most part, the LWLA1016 protocol seems to consist of basic register read and write commands. Unlike with the LWLA1034, it looks like capture setup, capture status polling and reading from memory are implemented on top of simple register reads and writes.&lt;br /&gt;
&lt;br /&gt;
=== Command 0001: Read Register ===&lt;br /&gt;
&lt;br /&gt;
Apparently identical to command 1 in the LWLA1034 protocol.&lt;br /&gt;
&lt;br /&gt;
==== Registers ====&lt;br /&gt;
&lt;br /&gt;
Some of the register addresses appearing in the protocol also occur in the LWLA1034 protocol, although it seems that their purpose may not be the same. Other registers appear to be specific to the LWLA1016.&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;
!Address&lt;br /&gt;
!Value&lt;br /&gt;
|-&lt;br /&gt;
| 1010&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 1070&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 107C&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 10B0&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 10B4&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 10B8&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 10BC&lt;br /&gt;
| ???&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Command 0002: Write Register ===&lt;br /&gt;
&lt;br /&gt;
Apparently identical to command 2 in the LWLA1034 protocol.&lt;br /&gt;
&lt;br /&gt;
==== Registers ====&lt;br /&gt;
&lt;br /&gt;
Some of the register addresses appearing in the protocol also occur in the LWLA1034 protocol, although it seems that their purpose may not be the same. Other registers appear to be specific to the LWLA1016.&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;
!Address&lt;br /&gt;
!Value&lt;br /&gt;
|-&lt;br /&gt;
| 1000&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 1010&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 107C&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 10B0&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 10B4&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 10B8&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 10BC&lt;br /&gt;
| ???&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Command 0003: Read ??? ===&lt;br /&gt;
&lt;br /&gt;
This command reads something from the device. It does not occur in the LWLA1034 protocol.&lt;br /&gt;
&lt;br /&gt;
==== Command ====&lt;br /&gt;
&lt;br /&gt;
Fixed (?) length of 4 words (8 bytes).&lt;br /&gt;
&lt;br /&gt;
==== Response ====&lt;br /&gt;
&lt;br /&gt;
The response to the command as sent by the vendor software consists of 8 words (16 bytes).&lt;br /&gt;
&lt;br /&gt;
=== Command 0005: Write ??? ===&lt;br /&gt;
&lt;br /&gt;
This command appears to have the same format and function as command 5 sent by the original LWLA1034 firmware. That means we can probably ignore it, just as with the LWLA1034.&lt;br /&gt;
&lt;br /&gt;
==== Command ====&lt;br /&gt;
&lt;br /&gt;
Fixed length of 33 words (66 bytes).&lt;br /&gt;
&lt;br /&gt;
== Task Recipes ==&lt;br /&gt;
&lt;br /&gt;
This section lists the commands issued by the software to perform a particular task.&lt;br /&gt;
&lt;br /&gt;
=== Initialization ===&lt;br /&gt;
&lt;br /&gt;
# Acquire control of USB device and select configuration 1&lt;br /&gt;
# Send FPGA bitstream to EP 4 via bulk transfer&lt;br /&gt;
# Initial register activity:&lt;br /&gt;
## Read register 0x10B4, expected reply is 0x12345678&lt;br /&gt;
## Read register 0x10B4 (again), expected reply is 0x12345678&lt;br /&gt;
## Send command 5, which seems to have the same format and payload as with the LWLA1034&lt;br /&gt;
## Read register 0x10B8, reply is 0x10&lt;br /&gt;
## Read register 0x10B0, reply is 0&lt;br /&gt;
## Read register 0x1070, reply is 0&lt;br /&gt;
## Read register 0x10BC, reply is 0x12340000&lt;br /&gt;
## Read register 0x1010, reply is 0&lt;br /&gt;
## Read register 0x10B8, reply is 0x10&lt;br /&gt;
## ...&lt;/div&gt;</summary>
		<author><name>Danielk</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=Sysclk_LWLA1016/Protocol&amp;diff=10869</id>
		<title>Sysclk LWLA1016/Protocol</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=Sysclk_LWLA1016/Protocol&amp;diff=10869"/>
		<updated>2015-07-02T17:45:27Z</updated>

		<summary type="html">&lt;p&gt;Danielk: Begin task recipes section&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The basic structure of the SysClk LWLA1016 protocol is similar to the [[Sysclk LWLA1034/Protocol]]. As one would expect, it looks very much like an earlier iteration of the LWLA1034 protocol. It appears to lack the specialized commands the LWLA1034 has for reading memory and capture setup/status. Most of the functionality seems to be implemented on top of basic register reads and writes, using the same commands as the LWLA1034 for those.&lt;br /&gt;
&lt;br /&gt;
== FPGA Configuration ==&lt;br /&gt;
&lt;br /&gt;
As with the LWLA1034, the FPGA bitstream is loaded via bulk transfer to USB end point 4. The format seems to be exactly the same, too.&lt;br /&gt;
&lt;br /&gt;
The Windows software ships four separate executables: One for running with 16 channels at up to 100 MSps, one for 8 channels at up to 200 MSps, and one for 8 channels at 250 MSps. A fourth executable runs the LWLA1016 in frequency counter mode. Each of the executables downloads its own bitstream to the FPGA.&lt;br /&gt;
&lt;br /&gt;
=== Application Behavior ===&lt;br /&gt;
&lt;br /&gt;
The vendor software transfers a new bitstream to the FPGA&lt;br /&gt;
# on application start,&lt;br /&gt;
# ... (TODO).&lt;br /&gt;
&lt;br /&gt;
Selecting specific device configurations may require downloading other bitstream variants to the device. TODO: Make sure all modes are covered.&lt;br /&gt;
&lt;br /&gt;
=== Firmware Extraction ===&lt;br /&gt;
&lt;br /&gt;
The FPGA bitstreams are stored in RBF (Raw Binary File) format, as with the LWLA1034. The bitstreams can be extracted from various DLLs installed with the Windows software (an extraction tool will be provided until we get permission to distribute the firmware). Unfortunately, unlike with the LWLA1034, the LWLA1016 firmware cannot be easily extracted from the installer executable without installing the software first.&lt;br /&gt;
&lt;br /&gt;
== Control Commands ==&lt;br /&gt;
&lt;br /&gt;
As with the LWLA1034, control commands are sent via bulk transfer to USB end point 2, with the response (if any) coming in from end point 6.&lt;br /&gt;
&lt;br /&gt;
For the most part, the LWLA1016 protocol seems to consist of basic register read and write commands. Unlike with the LWLA1034, it looks like capture setup, capture status polling and reading from memory are implemented on top of simple register reads and writes.&lt;br /&gt;
&lt;br /&gt;
=== Command 0001: Read Register ===&lt;br /&gt;
&lt;br /&gt;
Apparently identical to command 1 in the LWLA1034 protocol.&lt;br /&gt;
&lt;br /&gt;
==== Registers ====&lt;br /&gt;
&lt;br /&gt;
Some of the register addresses appearing in the protocol also occur in the LWLA1034 protocol, although it seems that their purpose may not be the same. Other registers appear to be specific to the LWLA1016.&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;
!Address&lt;br /&gt;
!Value&lt;br /&gt;
|-&lt;br /&gt;
| 1010&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 1070&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 107C&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 10B0&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 10B4&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 10B8&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 10BC&lt;br /&gt;
| ???&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Command 0002: Write Register ===&lt;br /&gt;
&lt;br /&gt;
Apparently identical to command 2 in the LWLA1034 protocol.&lt;br /&gt;
&lt;br /&gt;
==== Registers ====&lt;br /&gt;
&lt;br /&gt;
Some of the register addresses appearing in the protocol also occur in the LWLA1034 protocol, although it seems that their purpose may not be the same. Other registers appear to be specific to the LWLA1016.&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;
!Address&lt;br /&gt;
!Value&lt;br /&gt;
|-&lt;br /&gt;
| 1000&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 1010&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 107C&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 10B0&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 10B4&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 10B8&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 10BC&lt;br /&gt;
| ???&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Command 0003: Read ??? ===&lt;br /&gt;
&lt;br /&gt;
This command reads something from the device. It does not occur in the LWLA1034 protocol.&lt;br /&gt;
&lt;br /&gt;
==== Command ====&lt;br /&gt;
&lt;br /&gt;
Fixed (?) length of 4 words (8 bytes).&lt;br /&gt;
&lt;br /&gt;
==== Response ====&lt;br /&gt;
&lt;br /&gt;
The response to the command as sent by the vendor software consists of 8 words (16 bytes).&lt;br /&gt;
&lt;br /&gt;
== Task Recipes ==&lt;br /&gt;
&lt;br /&gt;
This section lists the commands issued by the software to perform a particular task.&lt;br /&gt;
&lt;br /&gt;
=== Initialization ===&lt;br /&gt;
&lt;br /&gt;
# Acquire control of USB device and select configuration 1&lt;br /&gt;
# Send FPGA bitstream to EP 4 via bulk transfer&lt;br /&gt;
# Initial register activity:&lt;br /&gt;
## Read register 0x10B4, expected reply is 0x12345678&lt;br /&gt;
## Read register 0x10B4 (again), expected reply is 0x12345678&lt;br /&gt;
## Send command 5, which seems to have the same format and payload as with the LWLA1034&lt;br /&gt;
## Read register 0x10B8, reply is 0x10&lt;br /&gt;
## Read register 0x10B0, reply is 0&lt;br /&gt;
## Read register 0x1070, reply is 0&lt;br /&gt;
## Read register 0x10BC, reply is 0x12340000&lt;br /&gt;
## Read register 0x1010, reply is 0&lt;br /&gt;
## Read register 0x10B8, reply is 0x10&lt;br /&gt;
## ...&lt;/div&gt;</summary>
		<author><name>Danielk</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=Protocol_decoder_HOWTO&amp;diff=10862</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=10862"/>
		<updated>2015-06-29T20:37:42Z</updated>

		<summary type="html">&lt;p&gt;Danielk: Hint on enums in Python&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 = (&lt;br /&gt;
         (&amp;#039;bit&amp;#039;, &amp;#039;Bit&amp;#039;),&lt;br /&gt;
         (&amp;#039;agc-pulse&amp;#039;, &amp;#039;AGC pulse&amp;#039;),&lt;br /&gt;
         (&amp;#039;longpause&amp;#039;, &amp;#039;Long pause&amp;#039;),&lt;br /&gt;
         (&amp;#039;shortpause&amp;#039;, &amp;#039;Short pause&amp;#039;),&lt;br /&gt;
         (&amp;#039;stop-bit&amp;#039;, &amp;#039;Stop bit&amp;#039;),&lt;br /&gt;
         (&amp;#039;leader-code&amp;#039;, &amp;#039;Leader code&amp;#039;),&lt;br /&gt;
         (&amp;#039;addr&amp;#039;, &amp;#039;Address&amp;#039;),&lt;br /&gt;
         (&amp;#039;addr-inv&amp;#039;, &amp;#039;Address#&amp;#039;),&lt;br /&gt;
         (&amp;#039;cmd&amp;#039;, &amp;#039;Command&amp;#039;),&lt;br /&gt;
         (&amp;#039;cmd-inv&amp;#039;, &amp;#039;Command#&amp;#039;),&lt;br /&gt;
         (&amp;#039;repeat-code&amp;#039;, &amp;#039;Repeat code&amp;#039;),&lt;br /&gt;
         (&amp;#039;remote&amp;#039;, &amp;#039;Remote&amp;#039;),&lt;br /&gt;
         (&amp;#039;warnings&amp;#039;, &amp;#039;Warnings&amp;#039;),&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;
== 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;
* A simple way to check whether an optional PD channel was supplied (by the frontend/user) in this run is:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
 if pin in (0, 1):&lt;br /&gt;
     do_stuff()&lt;br /&gt;
&amp;lt;/source&amp;gt;&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:&lt;br /&gt;
&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:&lt;br /&gt;
&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;&lt;br /&gt;
* An elegant way to convert a sequence of bus pins to a numeric value:&lt;br /&gt;
&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;):&lt;br /&gt;
&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.):&lt;br /&gt;
&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;&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:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 $ SIGROKDECODE_DIR=/path/to/libsigrokdecode/decoders/ sigrok-cli … -P &amp;lt;your decoder&amp;#039;s name&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&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 [[sigrok-test]] repository.&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;
* Send the decoder (preferrably as a patch against the current git HEAD of [[libsigrokdecode]]) to the [https://lists.sourceforge.net/lists/listinfo/sigrok-devel sigrok-devel] mailing list, and/or tell us the location of your git repository containing the decoder (on the &amp;#039;&amp;#039;&amp;#039;#sigrok&amp;#039;&amp;#039;&amp;#039; IRC channel on FreeNode).&lt;br /&gt;
* Please also send us a few example data files (*.sr) and a small README to go with your decoder. We&amp;#039;ll need these in order to properly review and test your decoder. Preferrably these files should also come as patches against the latest git HEAD of the [http://sigrok.org/gitweb/?p=sigrok-dumps.git;a=tree sigrok-dumps] repository. See [[Example dumps]] for details.&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>Danielk</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=Protocol_decoder_HOWTO&amp;diff=10861</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=10861"/>
		<updated>2015-06-29T20:33:16Z</updated>

		<summary type="html">&lt;p&gt;Danielk: Add hint on obtaining bus values&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 = (&lt;br /&gt;
         (&amp;#039;bit&amp;#039;, &amp;#039;Bit&amp;#039;),&lt;br /&gt;
         (&amp;#039;agc-pulse&amp;#039;, &amp;#039;AGC pulse&amp;#039;),&lt;br /&gt;
         (&amp;#039;longpause&amp;#039;, &amp;#039;Long pause&amp;#039;),&lt;br /&gt;
         (&amp;#039;shortpause&amp;#039;, &amp;#039;Short pause&amp;#039;),&lt;br /&gt;
         (&amp;#039;stop-bit&amp;#039;, &amp;#039;Stop bit&amp;#039;),&lt;br /&gt;
         (&amp;#039;leader-code&amp;#039;, &amp;#039;Leader code&amp;#039;),&lt;br /&gt;
         (&amp;#039;addr&amp;#039;, &amp;#039;Address&amp;#039;),&lt;br /&gt;
         (&amp;#039;addr-inv&amp;#039;, &amp;#039;Address#&amp;#039;),&lt;br /&gt;
         (&amp;#039;cmd&amp;#039;, &amp;#039;Command&amp;#039;),&lt;br /&gt;
         (&amp;#039;cmd-inv&amp;#039;, &amp;#039;Command#&amp;#039;),&lt;br /&gt;
         (&amp;#039;repeat-code&amp;#039;, &amp;#039;Repeat code&amp;#039;),&lt;br /&gt;
         (&amp;#039;remote&amp;#039;, &amp;#039;Remote&amp;#039;),&lt;br /&gt;
         (&amp;#039;warnings&amp;#039;, &amp;#039;Warnings&amp;#039;),&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;
== 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;
* A simple way to check whether an optional PD channel was supplied (by the frontend/user) in this run is:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
 if pin in (0, 1):&lt;br /&gt;
     do_stuff()&lt;br /&gt;
&amp;lt;/source&amp;gt;&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:&lt;br /&gt;
&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:&lt;br /&gt;
&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;&lt;br /&gt;
* An elegant way to convert a sequence of bus pins to a numeric value:&lt;br /&gt;
&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;):&lt;br /&gt;
&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;
* &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:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 $ SIGROKDECODE_DIR=/path/to/libsigrokdecode/decoders/ sigrok-cli … -P &amp;lt;your decoder&amp;#039;s name&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&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 [[sigrok-test]] repository.&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;
* Send the decoder (preferrably as a patch against the current git HEAD of [[libsigrokdecode]]) to the [https://lists.sourceforge.net/lists/listinfo/sigrok-devel sigrok-devel] mailing list, and/or tell us the location of your git repository containing the decoder (on the &amp;#039;&amp;#039;&amp;#039;#sigrok&amp;#039;&amp;#039;&amp;#039; IRC channel on FreeNode).&lt;br /&gt;
* Please also send us a few example data files (*.sr) and a small README to go with your decoder. We&amp;#039;ll need these in order to properly review and test your decoder. Preferrably these files should also come as patches against the latest git HEAD of the [http://sigrok.org/gitweb/?p=sigrok-dumps.git;a=tree sigrok-dumps] repository. See [[Example dumps]] for details.&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>Danielk</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=Sysclk_LWLA1016/Protocol&amp;diff=10860</id>
		<title>Sysclk LWLA1016/Protocol</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=Sysclk_LWLA1016/Protocol&amp;diff=10860"/>
		<updated>2015-06-29T20:14:54Z</updated>

		<summary type="html">&lt;p&gt;Danielk: Add detail on FPGA bitstreams&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The basic structure of the SysClk LWLA1016 protocol is similar to the [[Sysclk LWLA1034/Protocol]]. As one would expect, it looks very much like an earlier iteration of the LWLA1034 protocol. It appears to lack the specialized commands the LWLA1034 has for reading memory and capture setup/status. Most of the functionality seems to be implemented on top of basic register reads and writes, using the same commands as the LWLA1034 for those.&lt;br /&gt;
&lt;br /&gt;
== FPGA Configuration ==&lt;br /&gt;
&lt;br /&gt;
As with the LWLA1034, the FPGA bitstream is loaded via bulk transfer to USB end point 4. The format seems to be exactly the same, too.&lt;br /&gt;
&lt;br /&gt;
The Windows software ships four separate executables: One for running with 16 channels at up to 100 MSps, one for 8 channels at up to 200 MSps, and one for 8 channels at 250 MSps. A fourth executable runs the LWLA1016 in frequency counter mode. Each of the executables downloads its own bitstream to the FPGA.&lt;br /&gt;
&lt;br /&gt;
=== Application Behavior ===&lt;br /&gt;
&lt;br /&gt;
The vendor software transfers a new bitstream to the FPGA&lt;br /&gt;
# on application start,&lt;br /&gt;
# ... (TODO).&lt;br /&gt;
&lt;br /&gt;
Selecting specific device configurations may require downloading other bitstream variants to the device. TODO: Make sure all modes are covered.&lt;br /&gt;
&lt;br /&gt;
=== Firmware Extraction ===&lt;br /&gt;
&lt;br /&gt;
The FPGA bitstreams are stored in RBF (Raw Binary File) format, as with the LWLA1034. The bitstreams can be extracted from various DLLs installed with the Windows software (an extraction tool will be provided until we get permission to distribute the firmware). Unfortunately, unlike with the LWLA1034, the LWLA1016 firmware cannot be easily extracted from the installer executable without installing the software first.&lt;br /&gt;
&lt;br /&gt;
== Control Commands ==&lt;br /&gt;
&lt;br /&gt;
As with the LWLA1034, control commands are sent via bulk transfer to USB end point 2, with the response (if any) coming in from end point 6.&lt;br /&gt;
&lt;br /&gt;
For the most part, the LWLA1016 protocol seems to consist of basic register read and write commands. Unlike with the LWLA1034, it looks like capture setup, capture status polling and reading from memory are implemented on top of simple register reads and writes.&lt;br /&gt;
&lt;br /&gt;
=== Command 0001: Read Register ===&lt;br /&gt;
&lt;br /&gt;
Apparently identical to command 1 in the LWLA1034 protocol.&lt;br /&gt;
&lt;br /&gt;
==== Registers ====&lt;br /&gt;
&lt;br /&gt;
Some of the register addresses appearing in the protocol also occur in the LWLA1034 protocol, although it seems that their purpose may not be the same. Other registers appear to be specific to the LWLA1016.&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;
!Address&lt;br /&gt;
!Value&lt;br /&gt;
|-&lt;br /&gt;
| 1010&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 1070&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 107C&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 10B0&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 10B8&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 10BC&lt;br /&gt;
| ???&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Command 0002: Write Register ===&lt;br /&gt;
&lt;br /&gt;
Apparently identical to command 2 in the LWLA1034 protocol.&lt;br /&gt;
&lt;br /&gt;
==== Registers ====&lt;br /&gt;
&lt;br /&gt;
Some of the register addresses appearing in the protocol also occur in the LWLA1034 protocol, although it seems that their purpose may not be the same. Other registers appear to be specific to the LWLA1016.&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;
!Address&lt;br /&gt;
!Value&lt;br /&gt;
|-&lt;br /&gt;
| 1000&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 1010&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 107C&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 10B0&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 10B4&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 10B8&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 10BC&lt;br /&gt;
| ???&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Command 0003: Read ??? ===&lt;br /&gt;
&lt;br /&gt;
This command reads something from the device. It does not occur in the LWLA1034 protocol.&lt;br /&gt;
&lt;br /&gt;
==== Command ====&lt;br /&gt;
&lt;br /&gt;
Fixed (?) length of 4 words (8 bytes).&lt;br /&gt;
&lt;br /&gt;
==== Response ====&lt;br /&gt;
&lt;br /&gt;
The response to the command as sent by the vendor software consists of 8 words (16 bytes).&lt;/div&gt;</summary>
		<author><name>Danielk</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=Protocol_decoder:Z80&amp;diff=8758</id>
		<title>Protocol decoder:Z80</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=Protocol_decoder:Z80&amp;diff=8758"/>
		<updated>2014-03-02T12:23:38Z</updated>

		<summary type="html">&lt;p&gt;Danielk: License is GPL 3 or later&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox protocol decoder&lt;br /&gt;
| id              = z80&lt;br /&gt;
| name            = Z80&lt;br /&gt;
| description     = Zilog Z80 microprocessor disassembly&lt;br /&gt;
| status          = &amp;lt;span style=&amp;quot;background-color: lime&amp;quot;&amp;gt;supported&amp;lt;/span&amp;gt;&lt;br /&gt;
| license         = GPLv3+&lt;br /&gt;
| source_code_dir = z80&lt;br /&gt;
| image           = [[File:Z80 decoder example.png|250px]]&lt;br /&gt;
| input           = logic&lt;br /&gt;
| output          = z80&lt;br /&gt;
| probes          = D0&amp;amp;ndash;D7, /M1, /RD, /WR&lt;br /&gt;
| optional_probes = /MREQ, /IORQ, A0&amp;amp;ndash;A15&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
The &amp;#039;&amp;#039;&amp;#039;z80&amp;#039;&amp;#039;&amp;#039; protocol decoder disassembles the instruction stream of a Zilog Z80 microprocessor.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
=== KC 85/4 ===&lt;br /&gt;
&lt;br /&gt;
The [http://sigrok.org/gitweb/?p=sigrok-dumps.git;a=tree;f=z80/kc85 z80/kc85] directory in sigrok-dumps contains a set of example bus captures of the Z80-based [http://www.mpm-kc85.com/ KC 85/4] computer.&lt;br /&gt;
&lt;br /&gt;
The logic analyzer used was a [[Sysclk LWLA1034]].&lt;br /&gt;
&lt;br /&gt;
== Protocol ==&lt;br /&gt;
&lt;br /&gt;
The data bus lines plus the control signals /M1, /RD and /WR are sufficient to display full disassembly.  Optionally, the address bus lines and the control signals /MREQ and /IORQ may also be provided.&lt;br /&gt;
&lt;br /&gt;
== Resources ==&lt;br /&gt;
&lt;br /&gt;
[[Category:Protocol decoder]]&lt;/div&gt;</summary>
		<author><name>Danielk</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=User:Danielk&amp;diff=8757</id>
		<title>User:Danielk</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=User:Danielk&amp;diff=8757"/>
		<updated>2014-03-02T11:48:01Z</updated>

		<summary type="html">&lt;p&gt;Danielk: LWLA1034 is done, switch TODO to LWLA1016&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Hardware TODO list ==&lt;br /&gt;
&lt;br /&gt;
* [[Sysclk LWLA1016]]&lt;/div&gt;</summary>
		<author><name>Danielk</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=Protocol_decoder:Z80&amp;diff=8755</id>
		<title>Protocol decoder:Z80</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=Protocol_decoder:Z80&amp;diff=8755"/>
		<updated>2014-02-28T23:01:40Z</updated>

		<summary type="html">&lt;p&gt;Danielk: Limit image width to 250px&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox protocol decoder&lt;br /&gt;
| id              = z80&lt;br /&gt;
| name            = Z80&lt;br /&gt;
| description     = Zilog Z80 microprocessor disassembly&lt;br /&gt;
| status          = &amp;lt;span style=&amp;quot;background-color: lime&amp;quot;&amp;gt;supported&amp;lt;/span&amp;gt;&lt;br /&gt;
| license         = GPLv2+&lt;br /&gt;
| source_code_dir = z80&lt;br /&gt;
| image           = [[File:Z80 decoder example.png|250px]]&lt;br /&gt;
| input           = logic&lt;br /&gt;
| output          = z80&lt;br /&gt;
| probes          = D0&amp;amp;ndash;D7, /M1, /RD, /WR&lt;br /&gt;
| optional_probes = /MREQ, /IORQ, A0&amp;amp;ndash;A15&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
The &amp;#039;&amp;#039;&amp;#039;z80&amp;#039;&amp;#039;&amp;#039; protocol decoder disassembles the instruction stream of a Zilog Z80 microprocessor.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
=== KC 85/4 ===&lt;br /&gt;
&lt;br /&gt;
The [http://sigrok.org/gitweb/?p=sigrok-dumps.git;a=tree;f=z80/kc85 z80/kc85] directory in sigrok-dumps contains a set of example bus captures of the Z80-based [http://www.mpm-kc85.com/ KC 85/4] computer.&lt;br /&gt;
&lt;br /&gt;
The logic analyzer used was a [[Sysclk LWLA1034]].&lt;br /&gt;
&lt;br /&gt;
== Protocol ==&lt;br /&gt;
&lt;br /&gt;
The data bus lines plus the control signals /M1, /RD and /WR are sufficient to display full disassembly.  Optionally, the address bus lines and the control signals /MREQ and /IORQ may also be provided.&lt;br /&gt;
&lt;br /&gt;
== Resources ==&lt;br /&gt;
&lt;br /&gt;
[[Category:Protocol decoder]]&lt;/div&gt;</summary>
		<author><name>Danielk</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=File:Z80_decoder_example.png&amp;diff=8754</id>
		<title>File:Z80 decoder example.png</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=File:Z80_decoder_example.png&amp;diff=8754"/>
		<updated>2014-02-28T22:59:33Z</updated>

		<summary type="html">&lt;p&gt;Danielk: Sample disassembly by the Z80 decoder in PulseView&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
Sample disassembly by the Z80 decoder in PulseView&lt;br /&gt;
== Licensing ==&lt;br /&gt;
{{CC-BY-SA-3.0}}&lt;/div&gt;</summary>
		<author><name>Danielk</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=Protocol_decoder:Z80&amp;diff=8753</id>
		<title>Protocol decoder:Z80</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=Protocol_decoder:Z80&amp;diff=8753"/>
		<updated>2014-02-28T22:37:55Z</updated>

		<summary type="html">&lt;p&gt;Danielk: Create initial Z80 decoder page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox protocol decoder&lt;br /&gt;
| id              = z80&lt;br /&gt;
| name            = Z80&lt;br /&gt;
| description     = Zilog Z80 microprocessor disassembly&lt;br /&gt;
| status          = &amp;lt;span style=&amp;quot;background-color: lime&amp;quot;&amp;gt;supported&amp;lt;/span&amp;gt;&lt;br /&gt;
| license         = GPLv2+&lt;br /&gt;
| source_code_dir = z80&lt;br /&gt;
| image           = [[File:Z80 decoder example.png]]&lt;br /&gt;
| input           = logic&lt;br /&gt;
| output          = z80&lt;br /&gt;
| probes          = D0&amp;amp;ndash;D7, /M1, /RD, /WR&lt;br /&gt;
| optional_probes = /MREQ, /IORQ, A0&amp;amp;ndash;A15&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
The &amp;#039;&amp;#039;&amp;#039;z80&amp;#039;&amp;#039;&amp;#039; protocol decoder disassembles the instruction stream of a Zilog Z80 microprocessor.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
=== KC 85/4 ===&lt;br /&gt;
&lt;br /&gt;
The [http://sigrok.org/gitweb/?p=sigrok-dumps.git;a=tree;f=z80/kc85 z80/kc85] directory in sigrok-dumps contains a set of example bus captures of the Z80-based [http://www.mpm-kc85.com/ KC 85/4] computer.&lt;br /&gt;
&lt;br /&gt;
The logic analyzer used was a [[Sysclk LWLA1034]].&lt;br /&gt;
&lt;br /&gt;
== Protocol ==&lt;br /&gt;
&lt;br /&gt;
The data bus lines plus the control signals /M1, /RD and /WR are sufficient to display full disassembly.  Optionally, the address bus lines and the control signals /MREQ and /IORQ may also be provided.&lt;br /&gt;
&lt;br /&gt;
== Resources ==&lt;br /&gt;
&lt;br /&gt;
[[Category:Protocol decoder]]&lt;/div&gt;</summary>
		<author><name>Danielk</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=Sysclk_LWLA1034&amp;diff=8752</id>
		<title>Sysclk LWLA1034</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=Sysclk_LWLA1034&amp;diff=8752"/>
		<updated>2014-02-28T22:27:36Z</updated>

		<summary type="html">&lt;p&gt;Danielk: Link to correct item on AliExpress&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox logic analyzer&lt;br /&gt;
| image            = [[File:Sysclk lwla1034 mugshot.png|180px]]&lt;br /&gt;
| name             = Sysclk LWLA1034&lt;br /&gt;
| status           = supported&lt;br /&gt;
| source_code_dir  = sysclk-lwla&lt;br /&gt;
| channels         = 34&lt;br /&gt;
| samplerate       = 125MHz (max)&lt;br /&gt;
| samplerate_state = ?&lt;br /&gt;
| triggers         = 34 + extern&lt;br /&gt;
| voltages         = 0-5V&lt;br /&gt;
| threshold        = ?&lt;br /&gt;
| memory           = 256Kbit/channel&lt;br /&gt;
| compression      = RLE&lt;br /&gt;
| website          = [http://www.aliexpress.com/item/free-shipping-New-arrival-Powerful-100MHz-34-channels-LA1034-Logic-Analyzer-Timing-State-Logic-Analyzer/1227957767.html aliexpress.com]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
The &amp;#039;&amp;#039;&amp;#039;Sysclk LWLA1034&amp;#039;&amp;#039;&amp;#039; is a USB-based, 34-channel logic analyzer with up to 125MHz sampling rate.&lt;br /&gt;
&lt;br /&gt;
See [[Sysclk LWLA1034/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;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
* Altera EP2C5Q208C8N (Cyclone II) FPGA&lt;br /&gt;
* Cypress CY7C68013A-56 (FX2) USB interface chip&lt;br /&gt;
* Cypress 256k×36 SRAM (likely a [http://www.cypress.com/?mpn=CY7C1361C-133AXC CY7C1361C-133AXC] or similar)&lt;br /&gt;
* STC15F104E 8051-based microcontroller&lt;br /&gt;
&lt;br /&gt;
The not-installed 10-pin connector between the USB socket and the large capacitor seems to connect to the JTAG pins of the FPGA.&lt;br /&gt;
&lt;br /&gt;
== Photos ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Sysclk lwla1034 device top.jpg&lt;br /&gt;
File:Sysclk lwla1034 device bottom.jpg&lt;br /&gt;
File:Sysclk lwla1034 device connector.jpg&lt;br /&gt;
File:Sysclk lwla1034 device usb.jpg&lt;br /&gt;
File:Sysclk lwla1034 device open.jpg&lt;br /&gt;
File:Sysclk lwla1034 pcb top2.jpg&lt;br /&gt;
File:Sysclk lwla1034 pcb bottom2.jpg&lt;br /&gt;
File:Sysclk lwla1034 altera cyclone2.jpg&lt;br /&gt;
File:Sysclk lwla1034 cypress sram.jpg&lt;br /&gt;
File:Sysclk lwla1034 cypress fx2.jpg&lt;br /&gt;
File:Sysclk lwla1034 24c64n otherso8 crystal.jpg&lt;br /&gt;
File:Sysclk lwla1034 crystal 50mhz.jpg&lt;br /&gt;
File:Sysclk lwla1034 crystal 40mhz.jpg&lt;br /&gt;
File:Sysclk lwla1034 ams1117 33.jpg&lt;br /&gt;
File:Sysclk lwla1034 ams1117 12.jpg&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(Note: The yellow/greenish markings weren&amp;#039;t there, they&amp;#039;re added by the photographer)&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; PCB for another device&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Sysclk lwla1034 pcb top.jpg|&amp;lt;small&amp;gt;PCB, top&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Sysclk lwla1034 pcb bottom.jpg|&amp;lt;small&amp;gt;PCB, bottom&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Sysclk lwla1034 pcb closeup.jpg|&amp;lt;small&amp;gt;PCB, close-up&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Sysclk lwla1034 chip2.jpg|&amp;lt;small&amp;gt;Cypress FX2&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Sysclk lwla1034 chip3 removed marking.jpg|&amp;lt;small&amp;gt;SRAM (marking removed)&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
[[File:Sysclk lwla1034 software.png]]&lt;br /&gt;
&lt;br /&gt;
== Firmware ==&lt;br /&gt;
&lt;br /&gt;
We have received permission from the vendor to distribute the FPGA bitstreams with sigrok. Thus, the bitstreams are now included in the sigrok-firmware module.&lt;br /&gt;
&lt;br /&gt;
* The FX2 firmware is loaded from an EEPROM on the board, so that the final USB device descriptor is immediately available on power-up.&lt;br /&gt;
* Endpoint 4 is used exclusively for loading a new bitstream into the FPGA.&lt;br /&gt;
* Endpoint 2 is used for sending commands to the FPGA firmware, with responses (if any) coming in from endpoint 6.&lt;br /&gt;
&lt;br /&gt;
Reverse engineering of the vendor&amp;#039;s custom protocol has been completed. See [[Sysclk LWLA1034/Protocol]] for the documentation.&lt;br /&gt;
&lt;br /&gt;
== Resources ==&lt;br /&gt;
&lt;br /&gt;
* [http://blog.csdn.net/mcupro Mcupro blog on CSDN]&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>Danielk</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=Protocol_decoders&amp;diff=8709</id>
		<title>Protocol decoders</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=Protocol_decoders&amp;diff=8709"/>
		<updated>2014-02-18T22:49:55Z</updated>

		<summary type="html">&lt;p&gt;Danielk: Bump Z80 decoder progress to 80%&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a list of &amp;#039;&amp;#039;&amp;#039;supported protocol decoders (PDs)&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;decoders which we might want to write in the future&amp;#039;&amp;#039;&amp;#039; (or users might want to contribute).&lt;br /&gt;
&lt;br /&gt;
See [[Protocol decoder API]] for details on how the decoders work in sigrok, and [[Protocol decoder HOWTO]] for a quick introduction about how to write your own decoders.&lt;br /&gt;
&lt;br /&gt;
== Supported protocol decoders ==&lt;br /&gt;
&lt;br /&gt;
Number of currently supported protocol decoders: &amp;#039;&amp;#039;&amp;#039;31&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
Please do &amp;#039;&amp;#039;&amp;#039;not&amp;#039;&amp;#039;&amp;#039; edit this table in the wiki directly, it is automatically generated.&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; style=&amp;quot;font-size: smaller&amp;quot; class=&amp;quot;alternategrey sortable sigroktable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Protocol&lt;br /&gt;
!Category&lt;br /&gt;
!Input IDs&lt;br /&gt;
!Output IDs&lt;br /&gt;
!Status&lt;br /&gt;
!Full name&lt;br /&gt;
!Description&lt;br /&gt;
&lt;br /&gt;
{{pd|avr_isp|AVR ISP|AVR in-system programming|Protocol for in-system programming Atmel AVR MCUs.|Flash/debug|spi, logic|avr_isp|supported}}&lt;br /&gt;
{{pd|can|CAN|Controller Area Network|Field bus protocol for distributed realtime control.|Automotive|&amp;amp;mdash;|can|supported}}&lt;br /&gt;
{{pd|dcf77|DCF77|DCF77 time protocol|European longwave time signal (77.5kHz carrier signal).|Time signal|&amp;amp;mdash;|dcf77|supported}}&lt;br /&gt;
{{pd|ds1307|DS1307|Dallas DS1307|Realtime clock module protocol.|RTC|i2c|ds1307|supported}}&lt;br /&gt;
{{pd|edid|EDID|Extended Display Identification Data|Data structure describing display device capabilities.|PC|i2c|edid|supported}}&lt;br /&gt;
{{pd|i2cdemux|I2C demux|I2C demultiplexer|Demux I2C packets into per-slave-address streams.|Embedded|i2c|&amp;#039;&amp;#039;runtime decision&amp;#039;&amp;#039;|supported}}&lt;br /&gt;
{{pd|i2cfilter|I2C filter|I2C filter|Filter out addresses/directions in an I2C stream.|Embedded|i2c|i2c|supported}}&lt;br /&gt;
{{pd|i2c|I2C|Inter-Integrated Circuit|Two-wire, multi-master, serial bus.|Embedded|&amp;amp;mdash;|i2c|supported}}&lt;br /&gt;
{{pd|i2s|I2S|Integrated Interchip Sound|Serial bus for connecting digital audio devices.|Audio|&amp;amp;mdash;|i2s|supported}}&lt;br /&gt;
{{pd|jtag|JTAG|Joint Test Action Group (IEEE 1149.1)|Protocol for testing, debugging, and flashing ICs.|Flash/debug|&amp;amp;mdash;|jtag|supported}}&lt;br /&gt;
{{pd|jtag_stm32|JTAG / STM32|Joint Test Action Group / ST STM32|ST STM32-specific JTAG protocol.|Flash/debug|jtag|jtag_stm32|supported}}&lt;br /&gt;
{{pd|lm75|LM75|National LM75|National LM75 (and compatibles) temperature sensor protocol.|Sensors|i2c|lm75|supported}}&lt;br /&gt;
{{pd|lpc|LPC|Low-Pin-Count|Protocol for low-bandwidth devices on PC mainboards.|PC|&amp;amp;mdash;|lpc|supported}}&lt;br /&gt;
{{pd|maxim_ds28ea00|DS28EA00|Maxim DS28EA00 1-Wire digital thermometer|1-Wire digital thermometer with Sequence Detect and PIO.|Sensors|onewire_network|maxim_ds28ea00|supported}}&lt;br /&gt;
{{pd|midi|MIDI|Musical Instrument Digital Interface|Musical Instrument Digital Interface (MIDI) protocol.|Music|uart|midi|supported}}&lt;br /&gt;
{{pd|mlx90614|MLX90614|Melexis MLX90614|Infrared Thermometer protocol.|Sensors|i2c|mlx90614|supported}}&lt;br /&gt;
{{pd|mx25lxx05d|MX25Lxx05D|Macronix MX25Lxx05D|SPI (NOR) flash chip protocol.|SPI flash|spi, logic|mx25lxx05d|supported}}&lt;br /&gt;
{{pd|mxc6225xu|MXC6225XU|MEMSIC MXC6225XU|Digital Thermal Orientation Sensor (DTOS) protocol.|Sensors|i2c|mxc6225xu|supported}}&lt;br /&gt;
{{pd|nunchuk|Nunchuk|Nintendo Wii Nunchuk|Nintendo Wii Nunchuk controller protocol.|Other|i2c|nunchuk|supported}}&lt;br /&gt;
{{pd|onewire_link|1-Wire link layer|1-Wire serial communication bus (link layer)|Bidirectional, half-duplex, asynchronous serial bus.|Embedded|&amp;amp;mdash;|onewire_link|supported}}&lt;br /&gt;
{{pd|onewire_network|1-Wire network layer|1-Wire serial communication bus (network layer)|Bidirectional, half-duplex, asynchronous serial bus.|Embedded|onewire_link|onewire_network|supported}}&lt;br /&gt;
{{pd|pan1321|PAN1321|Panasonic PAN1321|Bluetooth RF module with Serial Port Profile (SPP).|Bluetooth|uart|pan1321|supported}}&lt;br /&gt;
{{pd|parallel|Parallel|Parallel sync bus|Generic parallel synchronous bus.|Misc|&amp;amp;mdash;|parallel|supported}}&lt;br /&gt;
{{pd|rtc8564|RTC-8564|Epson RTC-8564 JE/NB|Realtime clock module protocol.|RTC|i2c|rtc8564|supported}}&lt;br /&gt;
{{pd|sdcard_spi|SD card (SPI mode)|Secure Digital card (SPI mode)|Secure Digital card (SPI mode) low-level protocol.|Memory|spi|sdcard_spi|supported}}&lt;br /&gt;
{{pd|spi|SPI|Serial Peripheral Interface|Full-duplex, synchronous, serial bus.|Embedded|&amp;amp;mdash;|spi|supported}}&lt;br /&gt;
{{pd|tlc5620|TI TLC5620|Texas Instruments TLC5620|Texas Instruments TLC5620 8-bit quad DAC.|DAC|&amp;amp;mdash;|tlc5620|supported}}&lt;br /&gt;
{{pd|uart|UART|Universal Asynchronous Receiver/Transmitter|Asynchronous, serial bus.|Embedded|&amp;amp;mdash;|uart|supported}}&lt;br /&gt;
{{pd|usb_packet|USB packet|Universal Serial Bus (LS/FS) packet|USB (low-speed and full-speed) packet protocol.|USB|usb_signalling|usb_packet|supported}}&lt;br /&gt;
{{pd|usb_signalling|USB signalling|Universal Serial Bus (LS/FS) signalling|USB (low-speed and full-speed) signalling protocol.|USB|&amp;amp;mdash;|usb_signalling|supported}}&lt;br /&gt;
{{pd|xfp|XFP|10 Gigabit Small Form Factor Pluggable Module (XFP)|Data structure describing device capabilities.|Networking|i2c|xfp|supported}}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Possible candidates for future protocol decoders ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; style=&amp;quot;font-size: smaller&amp;quot; class=&amp;quot;alternategrey sortable sigroktable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Protocol&lt;br /&gt;
!Category&lt;br /&gt;
!Input ID(s)&lt;br /&gt;
!Output ID(s)&lt;br /&gt;
!Status&lt;br /&gt;
!Description&lt;br /&gt;
!Comments&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| SA8807A&lt;br /&gt;
| Displays&lt;br /&gt;
| spi&lt;br /&gt;
|&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
| SPI-attached LCD. Datasheet: [http://pdf1.alldatasheet.com/datasheet-pdf/view/36922/SAMES/SA8807A.html Sames SA8807A].&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| EA eDIPTFT43-A&lt;br /&gt;
| Displays&lt;br /&gt;
| i2c&lt;br /&gt;
|&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
| I2C-attached LCD. Datasheet: [http://www.lcd-module.de/pdf/grafik/ediptft43-a.pdf EA eDIPTFT43-A].&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| Analog Devices AD7291&lt;br /&gt;
| ADC&lt;br /&gt;
| i2c&lt;br /&gt;
|&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
| I2C-attached ADC. Datasheet: [http://pdf1.alldatasheet.com/datasheet-pdf/view/318172/AD/AD7291.html Analog Devices AD7291].&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| Analog Devices ADS1258&lt;br /&gt;
| ADC&lt;br /&gt;
| spi&lt;br /&gt;
| ads1258&lt;br /&gt;
| bgcolor=&amp;quot;orange&amp;quot; | 0%&lt;br /&gt;
| SPI-attached ADC.&lt;br /&gt;
| Planned (Uwe Hermann).&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| Microchip MCP3901&lt;br /&gt;
| ADC&lt;br /&gt;
| spi&lt;br /&gt;
| mcp3901&lt;br /&gt;
| bgcolor=&amp;quot;orange&amp;quot; | 0%&lt;br /&gt;
| Can be controlled via a parallel protocol, or SPI, or I2C.&lt;br /&gt;
| Planned (Uwe Hermann).&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| JTAG / TMPA9xx&lt;br /&gt;
| Flash/debug&lt;br /&gt;
| jtag&lt;br /&gt;
| jtag_tmpa9xx&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
| Toshiba TMPA9xx specific JTAG protocol details.&lt;br /&gt;
| &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| USB transaction&lt;br /&gt;
| USB&lt;br /&gt;
| usb_packet&lt;br /&gt;
| usb_transaction&lt;br /&gt;
| bgcolor=&amp;quot;yellow&amp;quot; | 30%&lt;br /&gt;
| &lt;br /&gt;
| Work in progress (Uwe Hermann).&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| USB transfer&lt;br /&gt;
| USB&lt;br /&gt;
| usb_transaction&lt;br /&gt;
| usb_transfer&lt;br /&gt;
| bgcolor=&amp;quot;yellow&amp;quot; | 10%&lt;br /&gt;
| &lt;br /&gt;
| Work in progress (Uwe Hermann).&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| USB / HID&lt;br /&gt;
| USB&lt;br /&gt;
| usb_transfer&lt;br /&gt;
| usb_hid&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| USB / CDC&lt;br /&gt;
| USB&lt;br /&gt;
| usb_transfer&lt;br /&gt;
| usb_cdc&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| USB / USBTMC&lt;br /&gt;
| USB&lt;br /&gt;
| usb_transfer&lt;br /&gt;
| usb_usbtmc&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| Dallas DS1985&lt;br /&gt;
| Other&lt;br /&gt;
| onewire_network&lt;br /&gt;
| &lt;br /&gt;
| bgcolor=&amp;quot;orange&amp;quot; | 0%&lt;br /&gt;
| Dallas DS1985 iButton (1-Wire) device.&lt;br /&gt;
| Planned (Uwe Hermann).&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| Microwire&lt;br /&gt;
| Embedded&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
|&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| UNI/O&lt;br /&gt;
| Embedded&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
|&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [https://en.wikipedia.org/wiki/Synchronous_Serial_Interface SSI]&lt;br /&gt;
| Embedded&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
|&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
| Synchronous Serial Interface&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| CompactFlash&lt;br /&gt;
| Memory&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
| &lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| MMC&lt;br /&gt;
| Memory&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
| &lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| Memory Stick&lt;br /&gt;
| Memory&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
| &lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| SmartMedia&lt;br /&gt;
| Memory&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
| &lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| xD-Picture Card&lt;br /&gt;
| Memory&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
| &lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| SD card (SD mode)&lt;br /&gt;
| Memory&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
| sdcard_sd&lt;br /&gt;
| bgcolor=&amp;quot;yellow&amp;quot; | 40%&lt;br /&gt;
|&lt;br /&gt;
| Work in progress (Uwe Hermann).&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [https://en.wikipedia.org/wiki/ISO/IEC_7816 ISO 7816]&lt;br /&gt;
| Smartcards&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
| &lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| FlexRay&lt;br /&gt;
| Automotive&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
|&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
| [http://en.wikipedia.org/wiki/Flexray FlexRay] is an automotive network communications protocol.&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| LIN&lt;br /&gt;
| Automotive&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
|&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
| [http://en.wikipedia.org/wiki/Local_Interconnect_Network LIN] (Local Interconnect Network) is an automotive bus standard.&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| SWD&lt;br /&gt;
| Flash/debug&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
| &lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
| [https://en.wikipedia.org/wiki/Joint_Test_Action_Group#Serial_Wire_Debug Serial Wire Debug]&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| AVR PDI&lt;br /&gt;
| Flash/debug&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
|&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
| Atmel Program and Debug Interface (PDI) protocol.&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| AVR TPI&lt;br /&gt;
| Flash/debug&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
|&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
| Atmel Tiny Programming Interface (TPI) protocol.&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| FWH&lt;br /&gt;
| PC&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
|&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| ISA&lt;br /&gt;
| PC&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
|&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| PCI&lt;br /&gt;
| PC&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
|&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| SMBus&lt;br /&gt;
| PC&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
|&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| IDE&lt;br /&gt;
| PC&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
|&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| SCSI&lt;br /&gt;
| PC&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
|&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| PS/2&lt;br /&gt;
| PC&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
|&lt;br /&gt;
| bgcolor=&amp;quot;orange&amp;quot; | 0%&lt;br /&gt;
|&lt;br /&gt;
| Planned (Uwe Hermann).&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [https://en.wikipedia.org/wiki/Platform_Environment_Control_Interface PECI]&lt;br /&gt;
| PC&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
|&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
| Platform Environment Control Interface&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [https://en.wikipedia.org/wiki/SVID SVID]&lt;br /&gt;
| PC&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
|&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
| Serial Voltage Identification&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| AC&amp;#039;97&lt;br /&gt;
| Audio&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
|&lt;br /&gt;
| bgcolor=&amp;quot;orange&amp;quot; | 0%&lt;br /&gt;
|&lt;br /&gt;
| Planned (Uwe Hermann).&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| HD Audio&lt;br /&gt;
| Audio&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
|&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| Nokia NRC17&lt;br /&gt;
| IR&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
|&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| Sony SIRC&lt;br /&gt;
| IR&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
|&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| Philips RC-5&lt;br /&gt;
| IR&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
|&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| Philips RC-6&lt;br /&gt;
| IR&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
|&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| Philips RC-MM&lt;br /&gt;
| IR&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
|&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| Philips RECS80&lt;br /&gt;
| IR&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
|&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [http://en.wikipedia.org/wiki/Infrared_Data_Association IrDA]&lt;br /&gt;
| Misc&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
|&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| PWM&lt;br /&gt;
| Misc&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
|&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| AT93C46&lt;br /&gt;
| EEPROM&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
|&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
| Atmel AT93C46 serial EEPROM protocol&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| HD44780&lt;br /&gt;
| Displays&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
|&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
| [http://en.wikipedia.org/wiki/HD44780_Character_LCD HD44780 character LCD] protocol&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 7-segment display&lt;br /&gt;
| Displays&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
|&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [[Protocol_decoder:Pcf8814|PCF8814]]&lt;br /&gt;
| Displays&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
| pcf8814&lt;br /&gt;
| bgcolor=&amp;quot;yellow&amp;quot; | 50%&lt;br /&gt;
| Philips PCF8814 65 x 96 pixels matrix LCD driver&lt;br /&gt;
| Work in progress (Uwe Hermann).&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [[Protocol_decoder:Pcf8814_lcd|PCF8814 LCD]]&lt;br /&gt;
| Displays&lt;br /&gt;
| pcf8814&lt;br /&gt;
| pcf8814_lcd&lt;br /&gt;
| bgcolor=&amp;quot;yellow&amp;quot; | 50%&lt;br /&gt;
| Philips PCF8814 65 x 96 pixels matrix LCD driver&lt;br /&gt;
| Work in progress (Uwe Hermann).&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| GPIB&lt;br /&gt;
| Other&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
| gpib&lt;br /&gt;
| bgcolor=&amp;quot;orange&amp;quot; | 0%&lt;br /&gt;
| [https://en.wikipedia.org/wiki/IEEE-488 General purpose interface bus] (GPIB), a.k.a. IEEE-488.1.&lt;br /&gt;
| Planned (Uwe Hermann).&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [https://en.wikipedia.org/wiki/DMX512 DMX512]&lt;br /&gt;
| Industrial Lighting&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
| dmx512&lt;br /&gt;
| bgcolor=&amp;quot;yellow&amp;quot; | 20%&lt;br /&gt;
| Digital MultipleX 512&lt;br /&gt;
| Work in progress (Uwe Hermann).&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [https://en.wikipedia.org/wiki/Digital_Signal_Interface DSI]&lt;br /&gt;
| Industrial Lighting&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
| dsi&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
| Digital Serial Interface&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [http://en.wikipedia.org/wiki/Digital_Addressable_Lighting_Interface DALI]&lt;br /&gt;
| Industrial Lighting&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
| dali&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [https://en.wikipedia.org/wiki/RDM_%28lighting%29 RDM]&lt;br /&gt;
| Industrial Lighting&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
| rdm&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| PWM&lt;br /&gt;
| Backlight Brightness Control&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
|&lt;br /&gt;
| bgcolor=&amp;quot;orange&amp;quot; | 0%&lt;br /&gt;
|&lt;br /&gt;
| Planned (Matt Ranostay).&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [https://en.wikipedia.org/wiki/NMEA_0183 NMEA 0183]&lt;br /&gt;
| GPS&lt;br /&gt;
| uart&lt;br /&gt;
| nmea0183&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [[Protocol_decoder:Nmea2000|NMEA2000]]&lt;br /&gt;
| Marine&lt;br /&gt;
| can&lt;br /&gt;
| nmea2000&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
| [https://en.wikipedia.org/wiki/NMEA_2000 NMEA 2000 Wikipedia page]&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [https://en.wikipedia.org/wiki/Digital_Command_Control DCC]&lt;br /&gt;
| Trains&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
| dcc&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [https://en.wikipedia.org/wiki/Train_Communication_Network MVB]&lt;br /&gt;
| Trains&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
| mvb&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
| Multifunction Vehicle Bus&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [https://en.wikipedia.org/wiki/Train_Communication_Network WTB]&lt;br /&gt;
| Trains&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
| wtb&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
| Wire Train Bus&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [https://en.wikipedia.org/wiki/C-Bus_%28protocol%29 C-Bus]&lt;br /&gt;
| Home automation&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
| cbus&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [https://en.wikipedia.org/wiki/X10_%28industry_standard%29 X10]&lt;br /&gt;
| Home automation&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
| x10&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [https://en.wikipedia.org/wiki/LonWorks LonWorks]&lt;br /&gt;
| Home automation&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
| lonworks&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [https://en.wikipedia.org/wiki/S-Bus S-Bus]&lt;br /&gt;
| Home automation&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
| sbus&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [https://en.wikipedia.org/wiki/Meter-Bus M-Bus]&lt;br /&gt;
| Automation&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
| mbus&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [https://en.wikipedia.org/wiki/Modbus Modbus RTU]&lt;br /&gt;
| Automation&lt;br /&gt;
| uart&lt;br /&gt;
| modbus&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [https://en.wikipedia.org/wiki/Modbus Modbus ASCII]&lt;br /&gt;
| Automation&lt;br /&gt;
| uart&lt;br /&gt;
| modbus&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [https://en.wikipedia.org/wiki/Modbus Modbus TCP]&lt;br /&gt;
| Automation&lt;br /&gt;
| ip&lt;br /&gt;
| modbus&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [https://en.wikipedia.org/wiki/Highway_Addressable_Remote_Transducer_Protocol HART protocol]&lt;br /&gt;
| Automation&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
| hart&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [https://en.wikipedia.org/wiki/INTERBUS INTERBUS]&lt;br /&gt;
| Automation&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
| interbus&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [https://en.wikipedia.org/wiki/DirectNET_Protocol DirectNET]&lt;br /&gt;
| Automation&lt;br /&gt;
| uart&lt;br /&gt;
| directnet&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [https://en.wikipedia.org/wiki/KNX_%28standard%29 KNX]&lt;br /&gt;
| Automation&lt;br /&gt;
| various&lt;br /&gt;
| knx&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [https://en.wikipedia.org/wiki/Bacnet BACnet]&lt;br /&gt;
| Automation&lt;br /&gt;
| &lt;br /&gt;
| bacnet&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [https://en.wikipedia.org/wiki/OpenTherm OpenTherm]&lt;br /&gt;
| Automation&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
| opentherm&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [https://en.wikipedia.org/wiki/EBUS_%28serial_buses%29 EBUS]&lt;br /&gt;
| Automation&lt;br /&gt;
| uart&lt;br /&gt;
| ebus&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [https://en.wikipedia.org/wiki/Attachment_Unit_Interface AUI]&lt;br /&gt;
| Networking&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
| aui&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
| Attachment Unit Interface&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [https://en.wikipedia.org/wiki/Medium_Dependent_Interface MDI]&lt;br /&gt;
| Networking&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
| mdi&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
| Medium Dependent Interface&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [https://en.wikipedia.org/wiki/Media_Independent_Interface MII]&lt;br /&gt;
| Networking&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
| mii&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
| Media Independent Interface&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [https://en.wikipedia.org/wiki/Gigabit_Media_Independent_Interface#Gigabit_Media_Independent_Interface GMII]&lt;br /&gt;
| Networking&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
| gmii&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
| Gigabit Media Independent Interface&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [https://en.wikipedia.org/wiki/10_Gigabit_Media_Independent_Interface#10_Gigabit_Media_Independent_Interface XGMII]&lt;br /&gt;
| Networking&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
| xgmii&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
| 10 Gigabit Media Independent Interface&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [https://en.wikipedia.org/wiki/Management_Data_Input/Output MDIO]&lt;br /&gt;
| Networking&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
| mdio&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
| Management Data Input/Output&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [https://en.wikipedia.org/wiki/Wiegand_interface Wiegand]&lt;br /&gt;
| RFID&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
| wiegand&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
| Wiegand interface&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [https://en.wikipedia.org/wiki/Zilog_Z80 Z80]&lt;br /&gt;
| Other&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
| z80&lt;br /&gt;
| bgcolor=&amp;quot;yellow&amp;quot; | 80%&lt;br /&gt;
| Zilog Z80 CPU&lt;br /&gt;
| Work in progress ([[User:Danielk]])&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
__FORCETOC__&lt;/div&gt;</summary>
		<author><name>Danielk</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=Protocol_decoders&amp;diff=8707</id>
		<title>Protocol decoders</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=Protocol_decoders&amp;diff=8707"/>
		<updated>2014-02-14T23:52:57Z</updated>

		<summary type="html">&lt;p&gt;Danielk: List Z80 CPU as future decoder&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a list of &amp;#039;&amp;#039;&amp;#039;supported protocol decoders (PDs)&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;decoders which we might want to write in the future&amp;#039;&amp;#039;&amp;#039; (or users might want to contribute).&lt;br /&gt;
&lt;br /&gt;
See [[Protocol decoder API]] for details on how the decoders work in sigrok, and [[Protocol decoder HOWTO]] for a quick introduction about how to write your own decoders.&lt;br /&gt;
&lt;br /&gt;
== Supported protocol decoders ==&lt;br /&gt;
&lt;br /&gt;
Number of currently supported protocol decoders: &amp;#039;&amp;#039;&amp;#039;31&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
Please do &amp;#039;&amp;#039;&amp;#039;not&amp;#039;&amp;#039;&amp;#039; edit this table in the wiki directly, it is automatically generated.&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; style=&amp;quot;font-size: smaller&amp;quot; class=&amp;quot;alternategrey sortable sigroktable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Protocol&lt;br /&gt;
!Category&lt;br /&gt;
!Input IDs&lt;br /&gt;
!Output IDs&lt;br /&gt;
!Status&lt;br /&gt;
!Full name&lt;br /&gt;
!Description&lt;br /&gt;
&lt;br /&gt;
{{pd|avr_isp|AVR ISP|AVR in-system programming|Protocol for in-system programming Atmel AVR MCUs.|Flash/debug|spi, logic|avr_isp|supported}}&lt;br /&gt;
{{pd|can|CAN|Controller Area Network|Field bus protocol for distributed realtime control.|Automotive|&amp;amp;mdash;|can|supported}}&lt;br /&gt;
{{pd|dcf77|DCF77|DCF77 time protocol|European longwave time signal (77.5kHz carrier signal).|Time signal|&amp;amp;mdash;|dcf77|supported}}&lt;br /&gt;
{{pd|ds1307|DS1307|Dallas DS1307|Realtime clock module protocol.|RTC|i2c|ds1307|supported}}&lt;br /&gt;
{{pd|edid|EDID|Extended Display Identification Data|Data structure describing display device capabilities.|PC|i2c|edid|supported}}&lt;br /&gt;
{{pd|i2cdemux|I2C demux|I2C demultiplexer|Demux I2C packets into per-slave-address streams.|Embedded|i2c|&amp;#039;&amp;#039;runtime decision&amp;#039;&amp;#039;|supported}}&lt;br /&gt;
{{pd|i2cfilter|I2C filter|I2C filter|Filter out addresses/directions in an I2C stream.|Embedded|i2c|i2c|supported}}&lt;br /&gt;
{{pd|i2c|I2C|Inter-Integrated Circuit|Two-wire, multi-master, serial bus.|Embedded|&amp;amp;mdash;|i2c|supported}}&lt;br /&gt;
{{pd|i2s|I2S|Integrated Interchip Sound|Serial bus for connecting digital audio devices.|Audio|&amp;amp;mdash;|i2s|supported}}&lt;br /&gt;
{{pd|jtag|JTAG|Joint Test Action Group (IEEE 1149.1)|Protocol for testing, debugging, and flashing ICs.|Flash/debug|&amp;amp;mdash;|jtag|supported}}&lt;br /&gt;
{{pd|jtag_stm32|JTAG / STM32|Joint Test Action Group / ST STM32|ST STM32-specific JTAG protocol.|Flash/debug|jtag|jtag_stm32|supported}}&lt;br /&gt;
{{pd|lm75|LM75|National LM75|National LM75 (and compatibles) temperature sensor protocol.|Sensors|i2c|lm75|supported}}&lt;br /&gt;
{{pd|lpc|LPC|Low-Pin-Count|Protocol for low-bandwidth devices on PC mainboards.|PC|&amp;amp;mdash;|lpc|supported}}&lt;br /&gt;
{{pd|maxim_ds28ea00|DS28EA00|Maxim DS28EA00 1-Wire digital thermometer|1-Wire digital thermometer with Sequence Detect and PIO.|Sensors|onewire_network|maxim_ds28ea00|supported}}&lt;br /&gt;
{{pd|midi|MIDI|Musical Instrument Digital Interface|Musical Instrument Digital Interface (MIDI) protocol.|Music|uart|midi|supported}}&lt;br /&gt;
{{pd|mlx90614|MLX90614|Melexis MLX90614|Infrared Thermometer protocol.|Sensors|i2c|mlx90614|supported}}&lt;br /&gt;
{{pd|mx25lxx05d|MX25Lxx05D|Macronix MX25Lxx05D|SPI (NOR) flash chip protocol.|SPI flash|spi, logic|mx25lxx05d|supported}}&lt;br /&gt;
{{pd|mxc6225xu|MXC6225XU|MEMSIC MXC6225XU|Digital Thermal Orientation Sensor (DTOS) protocol.|Sensors|i2c|mxc6225xu|supported}}&lt;br /&gt;
{{pd|nunchuk|Nunchuk|Nintendo Wii Nunchuk|Nintendo Wii Nunchuk controller protocol.|Other|i2c|nunchuk|supported}}&lt;br /&gt;
{{pd|onewire_link|1-Wire link layer|1-Wire serial communication bus (link layer)|Bidirectional, half-duplex, asynchronous serial bus.|Embedded|&amp;amp;mdash;|onewire_link|supported}}&lt;br /&gt;
{{pd|onewire_network|1-Wire network layer|1-Wire serial communication bus (network layer)|Bidirectional, half-duplex, asynchronous serial bus.|Embedded|onewire_link|onewire_network|supported}}&lt;br /&gt;
{{pd|pan1321|PAN1321|Panasonic PAN1321|Bluetooth RF module with Serial Port Profile (SPP).|Bluetooth|uart|pan1321|supported}}&lt;br /&gt;
{{pd|parallel|Parallel|Parallel sync bus|Generic parallel synchronous bus.|Misc|&amp;amp;mdash;|parallel|supported}}&lt;br /&gt;
{{pd|rtc8564|RTC-8564|Epson RTC-8564 JE/NB|Realtime clock module protocol.|RTC|i2c|rtc8564|supported}}&lt;br /&gt;
{{pd|sdcard_spi|SD card (SPI mode)|Secure Digital card (SPI mode)|Secure Digital card (SPI mode) low-level protocol.|Memory|spi|sdcard_spi|supported}}&lt;br /&gt;
{{pd|spi|SPI|Serial Peripheral Interface|Full-duplex, synchronous, serial bus.|Embedded|&amp;amp;mdash;|spi|supported}}&lt;br /&gt;
{{pd|tlc5620|TI TLC5620|Texas Instruments TLC5620|Texas Instruments TLC5620 8-bit quad DAC.|DAC|&amp;amp;mdash;|tlc5620|supported}}&lt;br /&gt;
{{pd|uart|UART|Universal Asynchronous Receiver/Transmitter|Asynchronous, serial bus.|Embedded|&amp;amp;mdash;|uart|supported}}&lt;br /&gt;
{{pd|usb_packet|USB packet|Universal Serial Bus (LS/FS) packet|USB (low-speed and full-speed) packet protocol.|USB|usb_signalling|usb_packet|supported}}&lt;br /&gt;
{{pd|usb_signalling|USB signalling|Universal Serial Bus (LS/FS) signalling|USB (low-speed and full-speed) signalling protocol.|USB|&amp;amp;mdash;|usb_signalling|supported}}&lt;br /&gt;
{{pd|xfp|XFP|10 Gigabit Small Form Factor Pluggable Module (XFP)|Data structure describing device capabilities.|Networking|i2c|xfp|supported}}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Possible candidates for future protocol decoders ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; style=&amp;quot;font-size: smaller&amp;quot; class=&amp;quot;alternategrey sortable sigroktable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Protocol&lt;br /&gt;
!Category&lt;br /&gt;
!Input ID(s)&lt;br /&gt;
!Output ID(s)&lt;br /&gt;
!Status&lt;br /&gt;
!Description&lt;br /&gt;
!Comments&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| SA8807A&lt;br /&gt;
| Displays&lt;br /&gt;
| spi&lt;br /&gt;
|&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
| SPI-attached LCD. Datasheet: [http://pdf1.alldatasheet.com/datasheet-pdf/view/36922/SAMES/SA8807A.html Sames SA8807A].&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| EA eDIPTFT43-A&lt;br /&gt;
| Displays&lt;br /&gt;
| i2c&lt;br /&gt;
|&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
| I2C-attached LCD. Datasheet: [http://www.lcd-module.de/pdf/grafik/ediptft43-a.pdf EA eDIPTFT43-A].&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| Analog Devices AD7291&lt;br /&gt;
| ADC&lt;br /&gt;
| i2c&lt;br /&gt;
|&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
| I2C-attached ADC. Datasheet: [http://pdf1.alldatasheet.com/datasheet-pdf/view/318172/AD/AD7291.html Analog Devices AD7291].&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| Analog Devices ADS1258&lt;br /&gt;
| ADC&lt;br /&gt;
| spi&lt;br /&gt;
| ads1258&lt;br /&gt;
| bgcolor=&amp;quot;orange&amp;quot; | 0%&lt;br /&gt;
| SPI-attached ADC.&lt;br /&gt;
| Planned (Uwe Hermann).&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| Microchip MCP3901&lt;br /&gt;
| ADC&lt;br /&gt;
| spi&lt;br /&gt;
| mcp3901&lt;br /&gt;
| bgcolor=&amp;quot;orange&amp;quot; | 0%&lt;br /&gt;
| Can be controlled via a parallel protocol, or SPI, or I2C.&lt;br /&gt;
| Planned (Uwe Hermann).&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| JTAG / TMPA9xx&lt;br /&gt;
| Flash/debug&lt;br /&gt;
| jtag&lt;br /&gt;
| jtag_tmpa9xx&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
| Toshiba TMPA9xx specific JTAG protocol details.&lt;br /&gt;
| &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| USB transaction&lt;br /&gt;
| USB&lt;br /&gt;
| usb_packet&lt;br /&gt;
| usb_transaction&lt;br /&gt;
| bgcolor=&amp;quot;yellow&amp;quot; | 30%&lt;br /&gt;
| &lt;br /&gt;
| Work in progress (Uwe Hermann).&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| USB transfer&lt;br /&gt;
| USB&lt;br /&gt;
| usb_transaction&lt;br /&gt;
| usb_transfer&lt;br /&gt;
| bgcolor=&amp;quot;yellow&amp;quot; | 10%&lt;br /&gt;
| &lt;br /&gt;
| Work in progress (Uwe Hermann).&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| USB / HID&lt;br /&gt;
| USB&lt;br /&gt;
| usb_transfer&lt;br /&gt;
| usb_hid&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| USB / CDC&lt;br /&gt;
| USB&lt;br /&gt;
| usb_transfer&lt;br /&gt;
| usb_cdc&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| USB / USBTMC&lt;br /&gt;
| USB&lt;br /&gt;
| usb_transfer&lt;br /&gt;
| usb_usbtmc&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| Dallas DS1985&lt;br /&gt;
| Other&lt;br /&gt;
| onewire_network&lt;br /&gt;
| &lt;br /&gt;
| bgcolor=&amp;quot;orange&amp;quot; | 0%&lt;br /&gt;
| Dallas DS1985 iButton (1-Wire) device.&lt;br /&gt;
| Planned (Uwe Hermann).&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| Microwire&lt;br /&gt;
| Embedded&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
|&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| UNI/O&lt;br /&gt;
| Embedded&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
|&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [https://en.wikipedia.org/wiki/Synchronous_Serial_Interface SSI]&lt;br /&gt;
| Embedded&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
|&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
| Synchronous Serial Interface&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| CompactFlash&lt;br /&gt;
| Memory&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
| &lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| MMC&lt;br /&gt;
| Memory&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
| &lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| Memory Stick&lt;br /&gt;
| Memory&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
| &lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| SmartMedia&lt;br /&gt;
| Memory&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
| &lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| xD-Picture Card&lt;br /&gt;
| Memory&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
| &lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| SD card (SD mode)&lt;br /&gt;
| Memory&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
| sdcard_sd&lt;br /&gt;
| bgcolor=&amp;quot;yellow&amp;quot; | 40%&lt;br /&gt;
|&lt;br /&gt;
| Work in progress (Uwe Hermann).&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [https://en.wikipedia.org/wiki/ISO/IEC_7816 ISO 7816]&lt;br /&gt;
| Smartcards&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
| &lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| FlexRay&lt;br /&gt;
| Automotive&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
|&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
| [http://en.wikipedia.org/wiki/Flexray FlexRay] is an automotive network communications protocol.&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| LIN&lt;br /&gt;
| Automotive&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
|&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
| [http://en.wikipedia.org/wiki/Local_Interconnect_Network LIN] (Local Interconnect Network) is an automotive bus standard.&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| SWD&lt;br /&gt;
| Flash/debug&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
| &lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
| [https://en.wikipedia.org/wiki/Joint_Test_Action_Group#Serial_Wire_Debug Serial Wire Debug]&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| AVR PDI&lt;br /&gt;
| Flash/debug&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
|&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
| Atmel Program and Debug Interface (PDI) protocol.&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| AVR TPI&lt;br /&gt;
| Flash/debug&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
|&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
| Atmel Tiny Programming Interface (TPI) protocol.&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| FWH&lt;br /&gt;
| PC&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
|&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| ISA&lt;br /&gt;
| PC&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
|&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| PCI&lt;br /&gt;
| PC&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
|&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| SMBus&lt;br /&gt;
| PC&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
|&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| IDE&lt;br /&gt;
| PC&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
|&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| SCSI&lt;br /&gt;
| PC&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
|&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| PS/2&lt;br /&gt;
| PC&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
|&lt;br /&gt;
| bgcolor=&amp;quot;orange&amp;quot; | 0%&lt;br /&gt;
|&lt;br /&gt;
| Planned (Uwe Hermann).&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [https://en.wikipedia.org/wiki/Platform_Environment_Control_Interface PECI]&lt;br /&gt;
| PC&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
|&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
| Platform Environment Control Interface&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [https://en.wikipedia.org/wiki/SVID SVID]&lt;br /&gt;
| PC&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
|&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
| Serial Voltage Identification&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| AC&amp;#039;97&lt;br /&gt;
| Audio&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
|&lt;br /&gt;
| bgcolor=&amp;quot;orange&amp;quot; | 0%&lt;br /&gt;
|&lt;br /&gt;
| Planned (Uwe Hermann).&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| HD Audio&lt;br /&gt;
| Audio&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
|&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| Nokia NRC17&lt;br /&gt;
| IR&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
|&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| Sony SIRC&lt;br /&gt;
| IR&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
|&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| Philips RC-5&lt;br /&gt;
| IR&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
|&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| Philips RC-6&lt;br /&gt;
| IR&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
|&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| Philips RC-MM&lt;br /&gt;
| IR&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
|&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| Philips RECS80&lt;br /&gt;
| IR&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
|&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [http://en.wikipedia.org/wiki/Infrared_Data_Association IrDA]&lt;br /&gt;
| Misc&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
|&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| PWM&lt;br /&gt;
| Misc&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
|&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| AT93C46&lt;br /&gt;
| EEPROM&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
|&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
| Atmel AT93C46 serial EEPROM protocol&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| HD44780&lt;br /&gt;
| Displays&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
|&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
| [http://en.wikipedia.org/wiki/HD44780_Character_LCD HD44780 character LCD] protocol&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 7-segment display&lt;br /&gt;
| Displays&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
|&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [[Protocol_decoder:Pcf8814|PCF8814]]&lt;br /&gt;
| Displays&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
| pcf8814&lt;br /&gt;
| bgcolor=&amp;quot;yellow&amp;quot; | 50%&lt;br /&gt;
| Philips PCF8814 65 x 96 pixels matrix LCD driver&lt;br /&gt;
| Work in progress (Uwe Hermann).&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [[Protocol_decoder:Pcf8814_lcd|PCF8814 LCD]]&lt;br /&gt;
| Displays&lt;br /&gt;
| pcf8814&lt;br /&gt;
| pcf8814_lcd&lt;br /&gt;
| bgcolor=&amp;quot;yellow&amp;quot; | 50%&lt;br /&gt;
| Philips PCF8814 65 x 96 pixels matrix LCD driver&lt;br /&gt;
| Work in progress (Uwe Hermann).&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| GPIB&lt;br /&gt;
| Other&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
| gpib&lt;br /&gt;
| bgcolor=&amp;quot;orange&amp;quot; | 0%&lt;br /&gt;
| [https://en.wikipedia.org/wiki/IEEE-488 General purpose interface bus] (GPIB), a.k.a. IEEE-488.1.&lt;br /&gt;
| Planned (Uwe Hermann).&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [https://en.wikipedia.org/wiki/DMX512 DMX512]&lt;br /&gt;
| Industrial Lighting&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
| dmx512&lt;br /&gt;
| bgcolor=&amp;quot;yellow&amp;quot; | 20%&lt;br /&gt;
| Digital MultipleX 512&lt;br /&gt;
| Work in progress (Uwe Hermann).&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [https://en.wikipedia.org/wiki/Digital_Signal_Interface DSI]&lt;br /&gt;
| Industrial Lighting&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
| dsi&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
| Digital Serial Interface&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [http://en.wikipedia.org/wiki/Digital_Addressable_Lighting_Interface DALI]&lt;br /&gt;
| Industrial Lighting&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
| dali&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [https://en.wikipedia.org/wiki/RDM_%28lighting%29 RDM]&lt;br /&gt;
| Industrial Lighting&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
| rdm&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| PWM&lt;br /&gt;
| Backlight Brightness Control&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
|&lt;br /&gt;
| bgcolor=&amp;quot;orange&amp;quot; | 0%&lt;br /&gt;
|&lt;br /&gt;
| Planned (Matt Ranostay).&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [https://en.wikipedia.org/wiki/NMEA_0183 NMEA 0183]&lt;br /&gt;
| GPS&lt;br /&gt;
| uart&lt;br /&gt;
| nmea0183&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [[Protocol_decoder:Nmea2000|NMEA2000]]&lt;br /&gt;
| Marine&lt;br /&gt;
| can&lt;br /&gt;
| nmea2000&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
| [https://en.wikipedia.org/wiki/NMEA_2000 NMEA 2000 Wikipedia page]&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [https://en.wikipedia.org/wiki/Digital_Command_Control DCC]&lt;br /&gt;
| Trains&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
| dcc&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [https://en.wikipedia.org/wiki/Train_Communication_Network MVB]&lt;br /&gt;
| Trains&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
| mvb&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
| Multifunction Vehicle Bus&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [https://en.wikipedia.org/wiki/Train_Communication_Network WTB]&lt;br /&gt;
| Trains&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
| wtb&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
| Wire Train Bus&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [https://en.wikipedia.org/wiki/C-Bus_%28protocol%29 C-Bus]&lt;br /&gt;
| Home automation&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
| cbus&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [https://en.wikipedia.org/wiki/X10_%28industry_standard%29 X10]&lt;br /&gt;
| Home automation&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
| x10&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [https://en.wikipedia.org/wiki/LonWorks LonWorks]&lt;br /&gt;
| Home automation&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
| lonworks&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [https://en.wikipedia.org/wiki/S-Bus S-Bus]&lt;br /&gt;
| Home automation&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
| sbus&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [https://en.wikipedia.org/wiki/Meter-Bus M-Bus]&lt;br /&gt;
| Automation&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
| mbus&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [https://en.wikipedia.org/wiki/Modbus Modbus RTU]&lt;br /&gt;
| Automation&lt;br /&gt;
| uart&lt;br /&gt;
| modbus&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [https://en.wikipedia.org/wiki/Modbus Modbus ASCII]&lt;br /&gt;
| Automation&lt;br /&gt;
| uart&lt;br /&gt;
| modbus&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [https://en.wikipedia.org/wiki/Modbus Modbus TCP]&lt;br /&gt;
| Automation&lt;br /&gt;
| ip&lt;br /&gt;
| modbus&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [https://en.wikipedia.org/wiki/Highway_Addressable_Remote_Transducer_Protocol HART protocol]&lt;br /&gt;
| Automation&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
| hart&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [https://en.wikipedia.org/wiki/INTERBUS INTERBUS]&lt;br /&gt;
| Automation&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
| interbus&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [https://en.wikipedia.org/wiki/DirectNET_Protocol DirectNET]&lt;br /&gt;
| Automation&lt;br /&gt;
| uart&lt;br /&gt;
| directnet&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [https://en.wikipedia.org/wiki/KNX_%28standard%29 KNX]&lt;br /&gt;
| Automation&lt;br /&gt;
| various&lt;br /&gt;
| knx&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [https://en.wikipedia.org/wiki/Bacnet BACnet]&lt;br /&gt;
| Automation&lt;br /&gt;
| &lt;br /&gt;
| bacnet&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [https://en.wikipedia.org/wiki/OpenTherm OpenTherm]&lt;br /&gt;
| Automation&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
| opentherm&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [https://en.wikipedia.org/wiki/EBUS_%28serial_buses%29 EBUS]&lt;br /&gt;
| Automation&lt;br /&gt;
| uart&lt;br /&gt;
| ebus&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [https://en.wikipedia.org/wiki/Attachment_Unit_Interface AUI]&lt;br /&gt;
| Networking&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
| aui&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
| Attachment Unit Interface&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [https://en.wikipedia.org/wiki/Medium_Dependent_Interface MDI]&lt;br /&gt;
| Networking&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
| mdi&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
| Medium Dependent Interface&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [https://en.wikipedia.org/wiki/Media_Independent_Interface MII]&lt;br /&gt;
| Networking&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
| mii&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
| Media Independent Interface&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [https://en.wikipedia.org/wiki/Gigabit_Media_Independent_Interface#Gigabit_Media_Independent_Interface GMII]&lt;br /&gt;
| Networking&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
| gmii&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
| Gigabit Media Independent Interface&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [https://en.wikipedia.org/wiki/10_Gigabit_Media_Independent_Interface#10_Gigabit_Media_Independent_Interface XGMII]&lt;br /&gt;
| Networking&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
| xgmii&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
| 10 Gigabit Media Independent Interface&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [https://en.wikipedia.org/wiki/Management_Data_Input/Output MDIO]&lt;br /&gt;
| Networking&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
| mdio&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
| Management Data Input/Output&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [https://en.wikipedia.org/wiki/Wiegand_interface Wiegand]&lt;br /&gt;
| RFID&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
| wiegand&lt;br /&gt;
| bgcolor=&amp;quot;red&amp;quot; | 0%&lt;br /&gt;
| Wiegand interface&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [https://en.wikipedia.org/wiki/Zilog_Z80 Z80]&lt;br /&gt;
| Other&lt;br /&gt;
| &amp;amp;mdash;&lt;br /&gt;
| z80&lt;br /&gt;
| bgcolor=&amp;quot;yellow&amp;quot; | 20%&lt;br /&gt;
| Zilog Z80 CPU&lt;br /&gt;
| Work in progress ([[User:Danielk]])&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
__FORCETOC__&lt;/div&gt;</summary>
		<author><name>Danielk</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=Sysclk_LWLA1034&amp;diff=8617</id>
		<title>Sysclk LWLA1034</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=Sysclk_LWLA1034&amp;diff=8617"/>
		<updated>2014-02-01T20:33:42Z</updated>

		<summary type="html">&lt;p&gt;Danielk: Mention that the firmware is now included in sigrok&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox logic analyzer&lt;br /&gt;
| image            = [[File:Sysclk lwla1034 mugshot.png|180px]]&lt;br /&gt;
| name             = Sysclk LWLA1034&lt;br /&gt;
| status           = supported&lt;br /&gt;
| source_code_dir  = sysclk-lwla&lt;br /&gt;
| channels         = 34&lt;br /&gt;
| samplerate       = 125MHz (max)&lt;br /&gt;
| samplerate_state = ?&lt;br /&gt;
| triggers         = 34 + extern&lt;br /&gt;
| voltages         = 0-5V&lt;br /&gt;
| threshold        = ?&lt;br /&gt;
| memory           = 256Kbit/channel&lt;br /&gt;
| compression      = RLE&lt;br /&gt;
| website          = [http://item.taobao.com/item.htm?id=19834430293 taobao.com]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
The &amp;#039;&amp;#039;&amp;#039;Sysclk LWLA1034&amp;#039;&amp;#039;&amp;#039; is a USB-based, 34-channel logic analyzer with up to 125MHz sampling rate.&lt;br /&gt;
&lt;br /&gt;
See [[Sysclk LWLA1034/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;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
* Altera EP2C5Q208C8N (Cyclone II) FPGA&lt;br /&gt;
* Cypress CY7C68013A-56 (FX2) USB interface chip&lt;br /&gt;
* Cypress 256k×36 SRAM (likely a [http://www.cypress.com/?mpn=CY7C1361C-133AXC CY7C1361C-133AXC] or similar)&lt;br /&gt;
* STC15F104E 8051-based microcontroller&lt;br /&gt;
&lt;br /&gt;
The not-installed 10-pin connector between the USB socket and the large capacitor seems to connect to the JTAG pins of the FPGA.&lt;br /&gt;
&lt;br /&gt;
== Photos ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Sysclk lwla1034 device top.jpg&lt;br /&gt;
File:Sysclk lwla1034 device bottom.jpg&lt;br /&gt;
File:Sysclk lwla1034 device connector.jpg&lt;br /&gt;
File:Sysclk lwla1034 device usb.jpg&lt;br /&gt;
File:Sysclk lwla1034 device open.jpg&lt;br /&gt;
File:Sysclk lwla1034 pcb top2.jpg&lt;br /&gt;
File:Sysclk lwla1034 pcb bottom2.jpg&lt;br /&gt;
File:Sysclk lwla1034 altera cyclone2.jpg&lt;br /&gt;
File:Sysclk lwla1034 cypress sram.jpg&lt;br /&gt;
File:Sysclk lwla1034 cypress fx2.jpg&lt;br /&gt;
File:Sysclk lwla1034 24c64n otherso8 crystal.jpg&lt;br /&gt;
File:Sysclk lwla1034 crystal 50mhz.jpg&lt;br /&gt;
File:Sysclk lwla1034 crystal 40mhz.jpg&lt;br /&gt;
File:Sysclk lwla1034 ams1117 33.jpg&lt;br /&gt;
File:Sysclk lwla1034 ams1117 12.jpg&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(Note: The yellow/greenish markings weren&amp;#039;t there, they&amp;#039;re added by the photographer)&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; PCB for another device&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Sysclk lwla1034 pcb top.jpg|&amp;lt;small&amp;gt;PCB, top&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Sysclk lwla1034 pcb bottom.jpg|&amp;lt;small&amp;gt;PCB, bottom&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Sysclk lwla1034 pcb closeup.jpg|&amp;lt;small&amp;gt;PCB, close-up&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Sysclk lwla1034 chip2.jpg|&amp;lt;small&amp;gt;Cypress FX2&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Sysclk lwla1034 chip3 removed marking.jpg|&amp;lt;small&amp;gt;SRAM (marking removed)&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
[[File:Sysclk lwla1034 software.png]]&lt;br /&gt;
&lt;br /&gt;
== Firmware ==&lt;br /&gt;
&lt;br /&gt;
We have received permission from the vendor to distribute the FPGA bitstreams with sigrok. Thus, the bitstreams are now included in the sigrok-firmware module.&lt;br /&gt;
&lt;br /&gt;
* The FX2 firmware is loaded from an EEPROM on the board, so that the final USB device descriptor is immediately available on power-up.&lt;br /&gt;
* Endpoint 4 is used exclusively for loading a new bitstream into the FPGA.&lt;br /&gt;
* Endpoint 2 is used for sending commands to the FPGA firmware, with responses (if any) coming in from endpoint 6.&lt;br /&gt;
&lt;br /&gt;
Reverse engineering of the vendor&amp;#039;s custom protocol has been completed. See [[Sysclk LWLA1034/Protocol]] for the documentation.&lt;br /&gt;
&lt;br /&gt;
== Resources ==&lt;br /&gt;
&lt;br /&gt;
* [http://blog.csdn.net/mcupro Mcupro blog on CSDN]&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>Danielk</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=Sysclk_LWLA1034&amp;diff=8528</id>
		<title>Sysclk LWLA1034</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=Sysclk_LWLA1034&amp;diff=8528"/>
		<updated>2014-01-20T21:11:57Z</updated>

		<summary type="html">&lt;p&gt;Danielk: Add STC15F104E to chip list&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox logic analyzer&lt;br /&gt;
| image            = [[File:Sysclk lwla1034 mugshot.png|180px]]&lt;br /&gt;
| name             = Sysclk LWLA1034&lt;br /&gt;
| status           = supported&lt;br /&gt;
| source_code_dir  = sysclk-lwla&lt;br /&gt;
| channels         = 34&lt;br /&gt;
| samplerate       = 125MHz (max)&lt;br /&gt;
| samplerate_state = ?&lt;br /&gt;
| triggers         = 34 + extern&lt;br /&gt;
| voltages         = 0-5V&lt;br /&gt;
| threshold        = ?&lt;br /&gt;
| memory           = 256Kbit/channel&lt;br /&gt;
| compression      = RLE&lt;br /&gt;
| website          = [http://item.taobao.com/item.htm?id=19834430293 taobao.com]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
The &amp;#039;&amp;#039;&amp;#039;Sysclk LWLA1034&amp;#039;&amp;#039;&amp;#039; is a USB-based, 34-channel logic analyzer with up to 125MHz sampling rate.&lt;br /&gt;
&lt;br /&gt;
See [[Sysclk LWLA1034/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;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
* Altera EP2C5Q208C8N (Cyclone II) FPGA&lt;br /&gt;
* Cypress CY7C68013A-56 (FX2) USB interface chip&lt;br /&gt;
* Cypress 256k×36 SRAM (likely a [http://www.cypress.com/?mpn=CY7C1361C-133AXC CY7C1361C-133AXC] or similar)&lt;br /&gt;
* STC15F104E 8051-based microcontroller&lt;br /&gt;
&lt;br /&gt;
The not-installed 10-pin connector between the USB socket and the large capacitor seems to connect to the JTAG pins of the FPGA.&lt;br /&gt;
&lt;br /&gt;
== Photos ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Sysclk lwla1034 device top.jpg&lt;br /&gt;
File:Sysclk lwla1034 device bottom.jpg&lt;br /&gt;
File:Sysclk lwla1034 device connector.jpg&lt;br /&gt;
File:Sysclk lwla1034 device usb.jpg&lt;br /&gt;
File:Sysclk lwla1034 device open.jpg&lt;br /&gt;
File:Sysclk lwla1034 pcb top2.jpg&lt;br /&gt;
File:Sysclk lwla1034 pcb bottom2.jpg&lt;br /&gt;
File:Sysclk lwla1034 altera cyclone2.jpg&lt;br /&gt;
File:Sysclk lwla1034 cypress sram.jpg&lt;br /&gt;
File:Sysclk lwla1034 cypress fx2.jpg&lt;br /&gt;
File:Sysclk lwla1034 24c64n otherso8 crystal.jpg&lt;br /&gt;
File:Sysclk lwla1034 crystal 50mhz.jpg&lt;br /&gt;
File:Sysclk lwla1034 crystal 40mhz.jpg&lt;br /&gt;
File:Sysclk lwla1034 ams1117 33.jpg&lt;br /&gt;
File:Sysclk lwla1034 ams1117 12.jpg&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(Note: The yellow/greenish markings weren&amp;#039;t there, they&amp;#039;re added by the photographer)&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; PCB for another device&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Sysclk lwla1034 pcb top.jpg|&amp;lt;small&amp;gt;PCB, top&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Sysclk lwla1034 pcb bottom.jpg|&amp;lt;small&amp;gt;PCB, bottom&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Sysclk lwla1034 pcb closeup.jpg|&amp;lt;small&amp;gt;PCB, close-up&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Sysclk lwla1034 chip2.jpg|&amp;lt;small&amp;gt;Cypress FX2&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Sysclk lwla1034 chip3 removed marking.jpg|&amp;lt;small&amp;gt;SRAM (marking removed)&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
[[File:Sysclk lwla1034 software.png]]&lt;br /&gt;
&lt;br /&gt;
== Firmware ==&lt;br /&gt;
&lt;br /&gt;
* The FX2 firmware is loaded from an EEPROM on the board, so that the final USB device descriptor is immediately available on power-up.&lt;br /&gt;
* Endpoint 4 is used exclusively for loading a new bitstream into the FPGA.&lt;br /&gt;
* Endpoint 2 is used for sending commands to the FPGA firmware, with responses (if any) coming in from endpoint 6.&lt;br /&gt;
&lt;br /&gt;
Reverse engineering of the vendor&amp;#039;s custom protocol has been completed. See [[Sysclk LWLA1034/Protocol]] for the documentation.&lt;br /&gt;
&lt;br /&gt;
== Resources ==&lt;br /&gt;
&lt;br /&gt;
* [http://blog.csdn.net/mcupro Mcupro blog on CSDN]&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>Danielk</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=Sysclk_LWLA1034&amp;diff=8483</id>
		<title>Sysclk LWLA1034</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=Sysclk_LWLA1034&amp;diff=8483"/>
		<updated>2014-01-17T01:28:13Z</updated>

		<summary type="html">&lt;p&gt;Danielk: Link to source code&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox logic analyzer&lt;br /&gt;
| image            = [[File:Sysclk lwla1034 mugshot.png|180px]]&lt;br /&gt;
| name             = Sysclk LWLA1034&lt;br /&gt;
| status           = supported&lt;br /&gt;
| source_code_dir  = sysclk-lwla&lt;br /&gt;
| channels         = 34&lt;br /&gt;
| samplerate       = 125MHz (max)&lt;br /&gt;
| samplerate_state = ?&lt;br /&gt;
| triggers         = 34 + extern&lt;br /&gt;
| voltages         = 0-5V&lt;br /&gt;
| threshold        = ?&lt;br /&gt;
| memory           = 256Kbit/channel&lt;br /&gt;
| compression      = RLE&lt;br /&gt;
| website          = [http://item.taobao.com/item.htm?id=19834430293 taobao.com]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
The &amp;#039;&amp;#039;&amp;#039;Sysclk LWLA1034&amp;#039;&amp;#039;&amp;#039; is a USB-based, 34-channel logic analyzer with up to 125MHz sampling rate.&lt;br /&gt;
&lt;br /&gt;
See [[Sysclk LWLA1034/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;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
* Altera EP2C5Q208C8N (Cyclone II) FPGA&lt;br /&gt;
* Cypress CY7C68013A-56 (FX2) USB interface chip&lt;br /&gt;
* Cypress 256k×36 SRAM (likely a [http://www.cypress.com/?mpn=CY7C1361C-133AXC CY7C1361C-133AXC] or similar)&lt;br /&gt;
&lt;br /&gt;
The not-installed 10-pin connector between the USB socket and the large capacitor seems to connect to the JTAG pins of the FPGA.&lt;br /&gt;
&lt;br /&gt;
== Photos ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Sysclk lwla1034 device top.jpg&lt;br /&gt;
File:Sysclk lwla1034 device bottom.jpg&lt;br /&gt;
File:Sysclk lwla1034 device connector.jpg&lt;br /&gt;
File:Sysclk lwla1034 device usb.jpg&lt;br /&gt;
File:Sysclk lwla1034 device open.jpg&lt;br /&gt;
File:Sysclk lwla1034 pcb top2.jpg&lt;br /&gt;
File:Sysclk lwla1034 pcb bottom2.jpg&lt;br /&gt;
File:Sysclk lwla1034 altera cyclone2.jpg&lt;br /&gt;
File:Sysclk lwla1034 cypress sram.jpg&lt;br /&gt;
File:Sysclk lwla1034 cypress fx2.jpg&lt;br /&gt;
File:Sysclk lwla1034 24c64n otherso8 crystal.jpg&lt;br /&gt;
File:Sysclk lwla1034 crystal 50mhz.jpg&lt;br /&gt;
File:Sysclk lwla1034 crystal 40mhz.jpg&lt;br /&gt;
File:Sysclk lwla1034 ams1117 33.jpg&lt;br /&gt;
File:Sysclk lwla1034 ams1117 12.jpg&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(Note: The yellow/greenish markings weren&amp;#039;t there, they&amp;#039;re added by the photographer)&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; PCB for another device&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Sysclk lwla1034 pcb top.jpg|&amp;lt;small&amp;gt;PCB, top&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Sysclk lwla1034 pcb bottom.jpg|&amp;lt;small&amp;gt;PCB, bottom&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Sysclk lwla1034 pcb closeup.jpg|&amp;lt;small&amp;gt;PCB, close-up&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Sysclk lwla1034 chip2.jpg|&amp;lt;small&amp;gt;Cypress FX2&amp;lt;/small&amp;gt;&lt;br /&gt;
File:Sysclk lwla1034 chip3 removed marking.jpg|&amp;lt;small&amp;gt;SRAM (marking removed)&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
[[File:Sysclk lwla1034 software.png]]&lt;br /&gt;
&lt;br /&gt;
== Firmware ==&lt;br /&gt;
&lt;br /&gt;
* The FX2 firmware is loaded from an EEPROM on the board, so that the final USB device descriptor is immediately available on power-up.&lt;br /&gt;
* Endpoint 4 is used exclusively for loading a new bitstream into the FPGA.&lt;br /&gt;
* Endpoint 2 is used for sending commands to the FPGA firmware, with responses (if any) coming in from endpoint 6.&lt;br /&gt;
&lt;br /&gt;
Reverse engineering of the vendor&amp;#039;s custom protocol has been completed. See [[Sysclk LWLA1034/Protocol]] for the documentation.&lt;br /&gt;
&lt;br /&gt;
== Resources ==&lt;br /&gt;
&lt;br /&gt;
* [http://blog.csdn.net/mcupro Mcupro blog on CSDN]&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>Danielk</name></author>
	</entry>
	<entry>
		<id>https://sigrok.org/w/index.php?title=Sysclk_LWLA1016/Protocol&amp;diff=8474</id>
		<title>Sysclk LWLA1016/Protocol</title>
		<link rel="alternate" type="text/html" href="https://sigrok.org/w/index.php?title=Sysclk_LWLA1016/Protocol&amp;diff=8474"/>
		<updated>2014-01-17T00:00:48Z</updated>

		<summary type="html">&lt;p&gt;Danielk: Start documenting the LWLA1016 protocol&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The basic structure of the SysClk LWLA1016 protocol is similar to the [[Sysclk LWLA1034/Protocol]]. As one would expect, it looks very much like an earlier iteration of the LWLA1034 protocol. It appears to lack the specialized commands the LWLA1034 has for reading memory and capture setup/status. Most of the functionality seems to be implemented on top of basic register reads and writes, using the same commands as the LWLA1034 for those.&lt;br /&gt;
&lt;br /&gt;
== FPGA Configuration ==&lt;br /&gt;
&lt;br /&gt;
As with the LWLA1034, the FPGA bitstream is loaded via bulk transfer to USB end point 4. The format seems to be exactly the same, too.&lt;br /&gt;
&lt;br /&gt;
=== Application Behavior ===&lt;br /&gt;
&lt;br /&gt;
The vendor software transfers a new bitstream to the FPGA&lt;br /&gt;
# on application start,&lt;br /&gt;
# ... (TODO).&lt;br /&gt;
&lt;br /&gt;
Selecting specific device configurations may require downloading other bitstream variants to the device. TODO: Make sure all modes are covered.&lt;br /&gt;
&lt;br /&gt;
=== Firmware Extraction ===&lt;br /&gt;
&lt;br /&gt;
At least one firmware blob belonging to the LWLA1016 can be found even in the LWLA1034 installer executable. There is also a second bitstream near to it which probably belongs to the LWLA1016 as well. However, the firmware extraction tool should work with whatever installer is actually shipped with the LWLA1016, which is unlikely to be the LWLA1034 one.&lt;br /&gt;
&lt;br /&gt;
== Control Commands ==&lt;br /&gt;
&lt;br /&gt;
As with the LWLA1034, control commands are sent via bulk transfer to USB end point 2, with the response (if any) coming in from end point 6.&lt;br /&gt;
&lt;br /&gt;
For the most part, the LWLA1016 protocol seems to consist of basic register read and write commands. Unlike with the LWLA1034, it looks like capture setup, capture status polling and reading from memory are implemented on top of simple register reads and writes.&lt;br /&gt;
&lt;br /&gt;
=== Command 0001: Read Register ===&lt;br /&gt;
&lt;br /&gt;
Apparently identical to command 1 in the LWLA1034 protocol.&lt;br /&gt;
&lt;br /&gt;
==== Registers ====&lt;br /&gt;
&lt;br /&gt;
Some of the register addresses appearing in the protocol also occur in the LWLA1034 protocol, although it seems that their purpose may not be the same. Other registers appear to be specific to the LWLA1016.&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;
!Address&lt;br /&gt;
!Value&lt;br /&gt;
|-&lt;br /&gt;
| 1010&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 1070&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 107C&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 10B0&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 10B8&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 10BC&lt;br /&gt;
| ???&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Command 0002: Write Register ===&lt;br /&gt;
&lt;br /&gt;
Apparently identical to command 2 in the LWLA1034 protocol.&lt;br /&gt;
&lt;br /&gt;
==== Registers ====&lt;br /&gt;
&lt;br /&gt;
Some of the register addresses appearing in the protocol also occur in the LWLA1034 protocol, although it seems that their purpose may not be the same. Other registers appear to be specific to the LWLA1016.&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;
!Address&lt;br /&gt;
!Value&lt;br /&gt;
|-&lt;br /&gt;
| 1000&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 1010&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 107C&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 10B0&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 10B4&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 10B8&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 10BC&lt;br /&gt;
| ???&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Command 0003: Read ??? ===&lt;br /&gt;
&lt;br /&gt;
This command reads something from the device. It does not occur in the LWLA1034 protocol.&lt;br /&gt;
&lt;br /&gt;
==== Command ====&lt;br /&gt;
&lt;br /&gt;
Fixed (?) length of 4 words (8 bytes).&lt;br /&gt;
&lt;br /&gt;
==== Response ====&lt;br /&gt;
&lt;br /&gt;
The response to the command as sent by the vendor software consists of 8 words (16 bytes).&lt;/div&gt;</summary>
		<author><name>Danielk</name></author>
	</entry>
</feed>