summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUwe Hermann <uwe@hermann-uwe.de>2012-01-15 15:36:01 +0100
committerUwe Hermann <uwe@hermann-uwe.de>2012-01-15 18:18:23 +0100
commit64c29e28e0efa184319f7831b3eca18c7f73f7d0 (patch)
tree16b7c84aa9edefb61e01f70384ff280edb3f3483
parentd0a0ed032e0120140a28e93ac42753786bf0087b (diff)
downloadlibsigrokdecode-64c29e28e0efa184319f7831b3eca18c7f73f7d0.tar.gz
libsigrokdecode-64c29e28e0efa184319f7831b3eca18c7f73f7d0.zip
srd: Each PD now has its own subdirectory.
-rw-r--r--configure.ac11
-rw-r--r--decoder.c123
-rw-r--r--decoders/Makefile.am28
-rw-r--r--decoders/dcf77/Makefile.am26
-rw-r--r--decoders/dcf77/__init__.py22
-rw-r--r--decoders/dcf77/dcf77.py (renamed from decoders/dcf77.py)0
-rw-r--r--decoders/ddc/Makefile.am26
-rw-r--r--decoders/ddc/__init__.py22
-rw-r--r--decoders/ddc/ddc.py (renamed from decoders/ddc.py)0
-rw-r--r--decoders/ebr30a_i2c_demux/Makefile.am26
-rw-r--r--decoders/ebr30a_i2c_demux/__init__.py22
-rw-r--r--decoders/ebr30a_i2c_demux/ebr30a_i2c_demux.py (renamed from decoders/ebr30a_i2c_demux.py)0
-rw-r--r--decoders/i2c/Makefile.am26
-rw-r--r--decoders/i2c/__init__.py22
-rw-r--r--decoders/i2c/i2c.py (renamed from decoders/i2c.py)0
-rw-r--r--decoders/mx25lxx05d/Makefile.am26
-rw-r--r--decoders/mx25lxx05d/__init__.py22
-rw-r--r--decoders/mx25lxx05d/mx25lxx05d.py (renamed from decoders/mx25lxx05d.py)0
-rw-r--r--decoders/nunchuk/Makefile.am26
-rw-r--r--decoders/nunchuk/__init__.py22
-rw-r--r--decoders/nunchuk/nunchuk.py (renamed from decoders/nunchuk.py)0
-rw-r--r--decoders/pan1321/Makefile.am26
-rw-r--r--decoders/pan1321/__init__.py22
-rw-r--r--decoders/pan1321/pan1321.py (renamed from decoders/pan1321.py)0
-rw-r--r--decoders/spi/Makefile.am26
-rw-r--r--decoders/spi/__init__.py22
-rw-r--r--decoders/spi/spi.py (renamed from decoders/spi.py)0
-rw-r--r--decoders/transitioncounter/Makefile.am26
-rw-r--r--decoders/transitioncounter/__init__.py22
-rw-r--r--decoders/transitioncounter/transitioncounter.py (renamed from decoders/transitioncounter.py)0
-rw-r--r--decoders/uart/Makefile.am26
-rw-r--r--decoders/uart/__init__.py22
-rw-r--r--decoders/uart/uart.py (renamed from decoders/uart.py)0
-rw-r--r--decoders/usb/Makefile.am26
-rw-r--r--decoders/usb/__init__.py22
-rw-r--r--decoders/usb/usb.py (renamed from decoders/usb.py)0
36 files changed, 659 insertions, 31 deletions
diff --git a/configure.ac b/configure.ac
index a60a6a9..7acdf40 100644
--- a/configure.ac
+++ b/configure.ac
@@ -150,6 +150,17 @@ AC_DEFINE(LIBSIGROKDECODE_VERSION, [libsigrokdecode_version],
AC_CONFIG_FILES([Makefile
libsigrokdecode.pc
decoders/Makefile
+ decoders/dcf77/Makefile
+ decoders/ddc/Makefile
+ decoders/ebr30a_i2c_demux/Makefile
+ decoders/i2c/Makefile
+ decoders/mx25lxx05d/Makefile
+ decoders/nunchuk/Makefile
+ decoders/pan1321/Makefile
+ decoders/spi/Makefile
+ decoders/transitioncounter/Makefile
+ decoders/uart/Makefile
+ decoders/usb/Makefile
])
AC_OUTPUT
diff --git a/decoder.c b/decoder.c
index dde067e..957d3a2 100644
--- a/decoder.c
+++ b/decoder.c
@@ -18,10 +18,10 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+#include <glib.h>
#include "config.h"
#include "sigrokdecode.h" /* First, so we avoid a _POSIX_C_SOURCE warning. */
#include "sigrokdecode-internal.h"
-#include <dirent.h>
/* The list of protocol decoders. */
GSList *pd_list = NULL;
@@ -66,7 +66,7 @@ struct srd_decoder *srd_get_decoder_by_id(const char *id)
/**
- * Load a protocol decoder module into the embedded python interpreter.
+ * Load a protocol decoder module into the embedded Python interpreter.
*
* @param name The module name to be loaded.
* @param dec Pointer to the struct srd_decoder filled with the loaded module.
@@ -82,17 +82,20 @@ int srd_load_decoder(const char *name, struct srd_decoder **dec)
py_basedec = NULL;
ret = SRD_ERR;
- srd_dbg("loading module %s", name);
+
+ srd_dbg("decoder: %s: loading module '%s'", __func__, name);
if (!(d = g_try_malloc0(sizeof(struct srd_decoder)))) {
+ srd_err("decoder: %s: d malloc failed", __func__);
ret = SRD_ERR_MALLOC;
goto err_out;
}
/* Import the Python module. */
if (!(d->py_mod = PyImport_ImportModule(name))) {
- /* TODO: report exception message/traceback to err/dbg */
- srd_dbg("import failed");
+ /* TODO: Report exception message/traceback to err/dbg. */
+ srd_warn("decoder: %s: import of '%s' failed", __func__, name);
+ PyErr_Print();
PyErr_Clear();
ret = SRD_ERR_PYTHON;
goto err_out;
@@ -101,6 +104,7 @@ int srd_load_decoder(const char *name, struct srd_decoder **dec)
/* Get the 'Decoder' class as Python object. */
if (!(d->py_dec = PyObject_GetAttrString(d->py_mod, "Decoder"))) {
/* This generated an AttributeError exception. */
+ PyErr_Print();
PyErr_Clear();
srd_err("Decoder class not found in protocol decoder module %s", name);
ret = SRD_ERR_PYTHON;
@@ -243,27 +247,117 @@ int srd_unload_decoder(struct srd_decoder *dec)
return SRD_OK;
}
+/**
+ * Check if the directory in the specified search path is a valid PD dir.
+ *
+ * A valid sigrok protocol decoder consists of a directory, which contains
+ * at least two .py files (the special __init__.py and at least one additional
+ * .py file which contains the actual PD code).
+ *
+ * TODO: We should also check that this is not a random other Python module,
+ * but really a sigrok PD module by some means.
+ *
+ * @param search_path A string containing the (absolute) path to the directory
+ * where 'entry' resides in.
+ * @param entry A string containing the (relative) directory name of the
+ * sigrok PD module. E.g. "i2c" for the I2C protocol decoder.
+ * @return SRD_OK, if the directory is a valid sigrok PD, a negative error
+ * code, such as SRD_ERR, otherwise.
+ */
+int srd_is_valid_pd_dir(const gchar *search_path, const gchar *entry)
+{
+ GDir *dir;
+ int py_files = 0, has_init_py = 0;
+ gchar *path1, *path2, *file;
+ GError *error;
+
+ /* TODO: Error handling. */
+ path1 = g_build_filename(search_path, entry, NULL);
+
+ /* Check that it is a directory (and exists). */
+ if (!g_file_test(path1, G_FILE_TEST_IS_DIR)) {
+ srd_dbg("decoder: %s: '%s' not a directory or doesn't exist",
+ __func__, entry);
+ return SRD_ERR;
+ }
+
+ if (!(dir = g_dir_open(path1, 0, &error))) { /* TODO: flags? */
+ srd_dbg("decoder: %s: '%s' failed to open directory",
+ __func__, entry);
+ return SRD_ERR;
+ }
+
+ /* Check the contents of the directory. */
+ while ((file = g_dir_read_name(dir)) != NULL) {
+ /* TODO: Error handling. */
+ path2 = g_build_filename(path1, file, NULL);
+
+ /* Ignore non-files. */
+ if (!g_file_test(path2, G_FILE_TEST_IS_REGULAR)) {
+ srd_spew("decoder: %s: '%s' not a file, ignoring",
+ __func__, file);
+ continue;
+ }
+
+ /* Count number of .py files. */
+ if (g_str_has_suffix(path2, ".py")) {
+ srd_spew("decoder: %s: found .py file: '%s'",
+ __func__, file);
+ py_files++;
+ }
+
+ /* Check if it's an __init__.py file. */
+ if (g_str_has_suffix(path2, "__init__.py")) {
+ srd_spew("decoder: %s: found __init__.py file: '%s'",
+ __func__, path2);
+ has_init_py = 1;
+ }
+ }
+ g_dir_close(dir);
+
+ /* Check if the directory contains >= 2 *.py files. */
+ if (py_files < 2) {
+ srd_dbg("decoder: %s: '%s' is not a valid PD dir, it doesn't "
+ "contain >= 2 .py files", __func__, entry);
+ return SRD_ERR;
+ }
+
+ /* Check if the directory contains an __init__.py file. */
+ if (!has_init_py) {
+ srd_dbg("decoder: %s: '%s' is not a valid PD dir, it doesn't "
+ "contain an __init__.py file", __func__, entry);
+ return SRD_ERR;
+ }
+
+ /* TODO: Check if it's a PD, not a random other Python module. */
+
+ return SRD_OK;
+}
int srd_load_all_decoders(void)
{
- DIR *dir;
- struct dirent *dp;
+ GDir *dir;
+ gchar *direntry;
int ret;
char *decodername;
struct srd_decoder *dec;
+ GError *error;
- if (!(dir = opendir(DECODERS_DIR))) {
+ if (!(dir = g_dir_open(DECODERS_DIR, 0, &error))) { /* TODO: flags? */
Py_Finalize(); /* Returns void. */
return SRD_ERR_DECODERS_DIR;
}
- while ((dp = readdir(dir)) != NULL) {
- /* Ignore filenames which don't end with ".py". */
- if (!g_str_has_suffix(dp->d_name, ".py"))
+ while ((direntry = g_dir_read_name(dir)) != NULL) {
+ /* Ignore directory entries which are not valid PDs. */
+ if (srd_is_valid_pd_dir(DECODERS_DIR, direntry) != SRD_OK) {
+ srd_dbg("decoder: %s: '%s' not a valid PD dir, "
+ "ignoring it", __func__, direntry);
continue;
+ }
- /* Decoder name == filename (without .py suffix). */
- decodername = g_strndup(dp->d_name, strlen(dp->d_name) - 3);
+ /* The decoder name is the PD directory name (e.g. "i2c"). */
+ decodername = g_strdup(direntry);
/* TODO: Error handling. Use g_try_malloc(). */
if (!(dec = malloc(sizeof(struct srd_decoder)))) {
@@ -278,12 +372,11 @@ int srd_load_all_decoders(void)
pd_list = g_slist_append(pd_list, dec);
}
}
- closedir(dir);
+ g_dir_close(dir);
return SRD_OK;
}
-
/**
* TODO
*/
diff --git a/decoders/Makefile.am b/decoders/Makefile.am
index 7c703ee..c1726cf 100644
--- a/decoders/Makefile.am
+++ b/decoders/Makefile.am
@@ -18,21 +18,17 @@
## Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
##
-pkgdatadir = $(DECODERS_DIR)
-
# Please keep this list in alphabetical order.
-dist_pkgdata_DATA = \
- dcf77.py \
- ddc.py \
- i2c.py \
- mx25lxx05d.py \
- nunchuk.py \
- pan1321.py \
- spi.py \
- usb.py \
- transitioncounter.py \
- ebr30a_i2c_demux.py \
- uart.py
-
-CLEANFILES = *.pyc
+SUBDIRS = \
+ dcf77 \
+ ddc \
+ ebr30a_i2c_demux \
+ i2c \
+ mx25lxx05d \
+ nunchuk \
+ pan1321 \
+ spi \
+ transitioncounter \
+ uart \
+ usb
diff --git a/decoders/dcf77/Makefile.am b/decoders/dcf77/Makefile.am
new file mode 100644
index 0000000..c55f0b7
--- /dev/null
+++ b/decoders/dcf77/Makefile.am
@@ -0,0 +1,26 @@
+##
+## This file is part of the sigrok project.
+##
+## Copyright (C) 2012 Uwe Hermann <uwe@hermann-uwe.de>
+##
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+##
+
+pkgdatadir = $(DECODERS_DIR)/dcf77
+
+dist_pkgdata_DATA = __init__.py dcf77.py
+
+CLEANFILES = *.pyc
+
diff --git a/decoders/dcf77/__init__.py b/decoders/dcf77/__init__.py
new file mode 100644
index 0000000..db7d2de
--- /dev/null
+++ b/decoders/dcf77/__init__.py
@@ -0,0 +1,22 @@
+##
+## This file is part of the sigrok project.
+##
+## Copyright (C) 2012 Uwe Hermann <uwe@hermann-uwe.de>
+##
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+##
+
+from .dcf77 import *
+
diff --git a/decoders/dcf77.py b/decoders/dcf77/dcf77.py
index 48b3bba..48b3bba 100644
--- a/decoders/dcf77.py
+++ b/decoders/dcf77/dcf77.py
diff --git a/decoders/ddc/Makefile.am b/decoders/ddc/Makefile.am
new file mode 100644
index 0000000..59c2c69
--- /dev/null
+++ b/decoders/ddc/Makefile.am
@@ -0,0 +1,26 @@
+##
+## This file is part of the sigrok project.
+##
+## Copyright (C) 2012 Uwe Hermann <uwe@hermann-uwe.de>
+##
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+##
+
+pkgdatadir = $(DECODERS_DIR)/ddc
+
+dist_pkgdata_DATA = __init__.py ddc.py
+
+CLEANFILES = *.pyc
+
diff --git a/decoders/ddc/__init__.py b/decoders/ddc/__init__.py
new file mode 100644
index 0000000..95cf31e
--- /dev/null
+++ b/decoders/ddc/__init__.py
@@ -0,0 +1,22 @@
+##
+## This file is part of the sigrok project.
+##
+## Copyright (C) 2012 Uwe Hermann <uwe@hermann-uwe.de>
+##
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+##
+
+from .ddc import *
+
diff --git a/decoders/ddc.py b/decoders/ddc/ddc.py
index f839093..f839093 100644
--- a/decoders/ddc.py
+++ b/decoders/ddc/ddc.py
diff --git a/decoders/ebr30a_i2c_demux/Makefile.am b/decoders/ebr30a_i2c_demux/Makefile.am
new file mode 100644
index 0000000..02e3421
--- /dev/null
+++ b/decoders/ebr30a_i2c_demux/Makefile.am
@@ -0,0 +1,26 @@
+##
+## This file is part of the sigrok project.
+##
+## Copyright (C) 2012 Uwe Hermann <uwe@hermann-uwe.de>
+##
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+##
+
+pkgdatadir = $(DECODERS_DIR)/ebr30a_i2c_demux
+
+dist_pkgdata_DATA = __init__.py ebr30a_i2c_demux.py
+
+CLEANFILES = *.pyc
+
diff --git a/decoders/ebr30a_i2c_demux/__init__.py b/decoders/ebr30a_i2c_demux/__init__.py
new file mode 100644
index 0000000..dddc8b7
--- /dev/null
+++ b/decoders/ebr30a_i2c_demux/__init__.py
@@ -0,0 +1,22 @@
+##
+## This file is part of the sigrok project.
+##
+## Copyright (C) 2012 Uwe Hermann <uwe@hermann-uwe.de>
+##
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+##
+
+from .ebr30a_i2c_demux import *
+
diff --git a/decoders/ebr30a_i2c_demux.py b/decoders/ebr30a_i2c_demux/ebr30a_i2c_demux.py
index 353fea8..353fea8 100644
--- a/decoders/ebr30a_i2c_demux.py
+++ b/decoders/ebr30a_i2c_demux/ebr30a_i2c_demux.py
diff --git a/decoders/i2c/Makefile.am b/decoders/i2c/Makefile.am
new file mode 100644
index 0000000..75a53eb
--- /dev/null
+++ b/decoders/i2c/Makefile.am
@@ -0,0 +1,26 @@
+##
+## This file is part of the sigrok project.
+##
+## Copyright (C) 2012 Uwe Hermann <uwe@hermann-uwe.de>
+##
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+##
+
+pkgdatadir = $(DECODERS_DIR)/i2c
+
+dist_pkgdata_DATA = __init__.py i2c.py
+
+CLEANFILES = *.pyc
+
diff --git a/decoders/i2c/__init__.py b/decoders/i2c/__init__.py
new file mode 100644
index 0000000..9e7856e
--- /dev/null
+++ b/decoders/i2c/__init__.py
@@ -0,0 +1,22 @@
+##
+## This file is part of the sigrok project.
+##
+## Copyright (C) 2012 Uwe Hermann <uwe@hermann-uwe.de>
+##
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+##
+
+from .i2c import *
+
diff --git a/decoders/i2c.py b/decoders/i2c/i2c.py
index f0a95b7..f0a95b7 100644
--- a/decoders/i2c.py
+++ b/decoders/i2c/i2c.py
diff --git a/decoders/mx25lxx05d/Makefile.am b/decoders/mx25lxx05d/Makefile.am
new file mode 100644
index 0000000..2d571f3
--- /dev/null
+++ b/decoders/mx25lxx05d/Makefile.am
@@ -0,0 +1,26 @@
+##
+## This file is part of the sigrok project.
+##
+## Copyright (C) 2012 Uwe Hermann <uwe@hermann-uwe.de>
+##
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+##
+
+pkgdatadir = $(DECODERS_DIR)/mx25lxx05d
+
+dist_pkgdata_DATA = __init__.py mx25lxx05d.py
+
+CLEANFILES = *.pyc
+
diff --git a/decoders/mx25lxx05d/__init__.py b/decoders/mx25lxx05d/__init__.py
new file mode 100644
index 0000000..0affc99
--- /dev/null
+++ b/decoders/mx25lxx05d/__init__.py
@@ -0,0 +1,22 @@
+##
+## This file is part of the sigrok project.
+##
+## Copyright (C) 2012 Uwe Hermann <uwe@hermann-uwe.de>
+##
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+##
+
+from .mx25lxx05d import *
+
diff --git a/decoders/mx25lxx05d.py b/decoders/mx25lxx05d/mx25lxx05d.py
index cd97dee..cd97dee 100644
--- a/decoders/mx25lxx05d.py
+++ b/decoders/mx25lxx05d/mx25lxx05d.py
diff --git a/decoders/nunchuk/Makefile.am b/decoders/nunchuk/Makefile.am
new file mode 100644
index 0000000..5a4917b
--- /dev/null
+++ b/decoders/nunchuk/Makefile.am
@@ -0,0 +1,26 @@
+##
+## This file is part of the sigrok project.
+##
+## Copyright (C) 2012 Uwe Hermann <uwe@hermann-uwe.de>
+##
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+##
+
+pkgdatadir = $(DECODERS_DIR)/nunchuk
+
+dist_pkgdata_DATA = __init__.py nunchuk.py
+
+CLEANFILES = *.pyc
+
diff --git a/decoders/nunchuk/__init__.py b/decoders/nunchuk/__init__.py
new file mode 100644
index 0000000..6772ba7
--- /dev/null
+++ b/decoders/nunchuk/__init__.py
@@ -0,0 +1,22 @@
+##
+## This file is part of the sigrok project.
+##
+## Copyright (C) 2012 Uwe Hermann <uwe@hermann-uwe.de>
+##
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+##
+
+from .nunchuk import *
+
diff --git a/decoders/nunchuk.py b/decoders/nunchuk/nunchuk.py
index 46bf53c..46bf53c 100644
--- a/decoders/nunchuk.py
+++ b/decoders/nunchuk/nunchuk.py
diff --git a/decoders/pan1321/Makefile.am b/decoders/pan1321/Makefile.am
new file mode 100644
index 0000000..6997ed5
--- /dev/null
+++ b/decoders/pan1321/Makefile.am
@@ -0,0 +1,26 @@
+##
+## This file is part of the sigrok project.
+##
+## Copyright (C) 2012 Uwe Hermann <uwe@hermann-uwe.de>
+##
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+##
+
+pkgdatadir = $(DECODERS_DIR)/pan1321
+
+dist_pkgdata_DATA = __init__.py pan1321.py
+
+CLEANFILES = *.pyc
+
diff --git a/decoders/pan1321/__init__.py b/decoders/pan1321/__init__.py
new file mode 100644
index 0000000..abbcf5d
--- /dev/null
+++ b/decoders/pan1321/__init__.py
@@ -0,0 +1,22 @@
+##
+## This file is part of the sigrok project.
+##
+## Copyright (C) 2012 Uwe Hermann <uwe@hermann-uwe.de>
+##
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+##
+
+from .pan1321 import *
+
diff --git a/decoders/pan1321.py b/decoders/pan1321/pan1321.py
index 55676ce..55676ce 100644
--- a/decoders/pan1321.py
+++ b/decoders/pan1321/pan1321.py
diff --git a/decoders/spi/Makefile.am b/decoders/spi/Makefile.am
new file mode 100644
index 0000000..89bf640
--- /dev/null
+++ b/decoders/spi/Makefile.am
@@ -0,0 +1,26 @@
+##
+## This file is part of the sigrok project.
+##
+## Copyright (C) 2012 Uwe Hermann <uwe@hermann-uwe.de>
+##
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+##
+
+pkgdatadir = $(DECODERS_DIR)/spi
+
+dist_pkgdata_DATA = __init__.py spi.py
+
+CLEANFILES = *.pyc
+
diff --git a/decoders/spi/__init__.py b/decoders/spi/__init__.py
new file mode 100644
index 0000000..3276fed
--- /dev/null
+++ b/decoders/spi/__init__.py
@@ -0,0 +1,22 @@
+##
+## This file is part of the sigrok project.
+##
+## Copyright (C) 2012 Uwe Hermann <uwe@hermann-uwe.de>
+##
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+##
+
+from .spi import *
+
diff --git a/decoders/spi.py b/decoders/spi/spi.py
index 07b8da2..07b8da2 100644
--- a/decoders/spi.py
+++ b/decoders/spi/spi.py
diff --git a/decoders/transitioncounter/Makefile.am b/decoders/transitioncounter/Makefile.am
new file mode 100644
index 0000000..74688a3
--- /dev/null
+++ b/decoders/transitioncounter/Makefile.am
@@ -0,0 +1,26 @@
+##
+## This file is part of the sigrok project.
+##
+## Copyright (C) 2012 Uwe Hermann <uwe@hermann-uwe.de>
+##
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+##
+
+pkgdatadir = $(DECODERS_DIR)/transitioncounter
+
+dist_pkgdata_DATA = __init__.py transitioncounter.py
+
+CLEANFILES = *.pyc
+
diff --git a/decoders/transitioncounter/__init__.py b/decoders/transitioncounter/__init__.py
new file mode 100644
index 0000000..bdf296b
--- /dev/null
+++ b/decoders/transitioncounter/__init__.py
@@ -0,0 +1,22 @@
+##
+## This file is part of the sigrok project.
+##
+## Copyright (C) 2012 Uwe Hermann <uwe@hermann-uwe.de>
+##
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+##
+
+from .transitioncounter import *
+
diff --git a/decoders/transitioncounter.py b/decoders/transitioncounter/transitioncounter.py
index 4c832b0..4c832b0 100644
--- a/decoders/transitioncounter.py
+++ b/decoders/transitioncounter/transitioncounter.py
diff --git a/decoders/uart/Makefile.am b/decoders/uart/Makefile.am
new file mode 100644
index 0000000..155bfc9
--- /dev/null
+++ b/decoders/uart/Makefile.am
@@ -0,0 +1,26 @@
+##
+## This file is part of the sigrok project.
+##
+## Copyright (C) 2012 Uwe Hermann <uwe@hermann-uwe.de>
+##
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+##
+
+pkgdatadir = $(DECODERS_DIR)/uart
+
+dist_pkgdata_DATA = __init__.py uart.py
+
+CLEANFILES = *.pyc
+
diff --git a/decoders/uart/__init__.py b/decoders/uart/__init__.py
new file mode 100644
index 0000000..4267d83
--- /dev/null
+++ b/decoders/uart/__init__.py
@@ -0,0 +1,22 @@
+##
+## This file is part of the sigrok project.
+##
+## Copyright (C) 2012 Uwe Hermann <uwe@hermann-uwe.de>
+##
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+##
+
+from .uart import *
+
diff --git a/decoders/uart.py b/decoders/uart/uart.py
index 4752c7d..4752c7d 100644
--- a/decoders/uart.py
+++ b/decoders/uart/uart.py
diff --git a/decoders/usb/Makefile.am b/decoders/usb/Makefile.am
new file mode 100644
index 0000000..f758e06
--- /dev/null
+++ b/decoders/usb/Makefile.am
@@ -0,0 +1,26 @@
+##
+## This file is part of the sigrok project.
+##
+## Copyright (C) 2012 Uwe Hermann <uwe@hermann-uwe.de>
+##
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+##
+
+pkgdatadir = $(DECODERS_DIR)/usb
+
+dist_pkgdata_DATA = __init__.py usb.py
+
+CLEANFILES = *.pyc
+
diff --git a/decoders/usb/__init__.py b/decoders/usb/__init__.py
new file mode 100644
index 0000000..068cadf
--- /dev/null
+++ b/decoders/usb/__init__.py
@@ -0,0 +1,22 @@
+##
+## This file is part of the sigrok project.
+##
+## Copyright (C) 2012 Uwe Hermann <uwe@hermann-uwe.de>
+##
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+##
+
+from .usb import *
+
diff --git a/decoders/usb.py b/decoders/usb/usb.py
index 073fe01..073fe01 100644
--- a/decoders/usb.py
+++ b/decoders/usb/usb.py