/* $Id$ * $URL$ * * driver for the LCD-Linux HD44780 kernel driver * http://lcd-linux.sourceforge.net * * Copyright (C) 2005 Michael Reinelt * Copyright (C) 2005 The LCD4Linux Team * * This file is part of LCD4Linux. * * LCD4Linux 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, or (at your option) * any later version. * * LCD4Linux 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., 675 Mass Ave, Cambridge, MA 02139, USA. * */ /* * * exported fuctions: * * struct DRIVER drv_LCDLinux * */ #include "config.h" #include #include #include #include #include #include #include #include #include #include "debug.h" #include "cfg.h" #include "qprintf.h" #include "plugin.h" #include "widget.h" #include "widget_text.h" #include "widget_icon.h" #include "widget_bar.h" #include "drv.h" #include "drv_generic_text.h" #define LCD_LINUX_MAIN #include #include static char Name[] = "LCD-Linux"; static char Device[] = "/dev/lcd"; static int lcdlinux_fd = -1; /****************************************/ /*** hardware dependant functions ***/ /****************************************/ static void drv_LL_send(const char *string, const int len) { int run, ret; for (run = 0; run < 10; run++) { ret = write(lcdlinux_fd, string, len); if (ret >= 0 || errno != EAGAIN) break; if (run > 0) info("%s: write(%s): EAGAIN #%d", Name, Device, run); usleep(1000); } if (ret < 0) { error("%s: write(%s) failed: %s", Name, Device, strerror(errno)); } else if (ret != len) { error("%s: partial write(%s): len=%d ret=%d", Name, Device, len, ret); } return; } static void drv_LL_clear(void) { /* No return value check since this ioctl cannot fail */ ioctl(lcdlinux_fd, LCDL_CLEAR_DISP); } static void drv_LL_write(const int row, const int col, const char *data, int len) { int pos = row * DCOLS + col; if (lseek(lcdlinux_fd, pos, SEEK_SET) == (off_t) - 1) { error("%s: lseek(%s) failed: %s", Name, Device, strerror(errno)); } drv_LL_send(data, len); } static void drv_LL_defchar(const int ascii, const unsigned char *matrix) { char buf[9]; int i; buf[0] = ascii; for (i = 1; i < 9; i++) { buf[i] = *matrix++ & 0x1f; } if (ioctl(lcdlinux_fd, LCDL_SET_CGRAM_CHAR, &buf) != 0) { error("%s: ioctl(LCDL_SET_CGRAM_CHAR) failed: %s", Name, strerror(errno)); } } static int drv_LL_start(const char *section, const int quiet) { char *s; int rows = -1, cols = -1; int use_busy = 0, bus4bits = 0, commit = 0; struct lcd_parameters buf; /* emit version information */ info("%s: Version %s", Name, LCD_LINUX_VERSION); /* get size from config file */ s = cfg_get(section, "Size", NULL); if (s != NULL || *s != '\0') { if (sscanf(s, "%dx%d", &cols, &rows) != 2 || rows < 1 || cols < 1) { error("%s: bad %s.Size '%s' from %s", Name, section, s, cfg_source()); free(s); return -1; } } free(s); /* open device */ lcdlinux_fd = open(Device, O_WRONLY); if (lcdlinux_fd == -1) { error("%s: open(%s) failed: %s", Name, Device, strerror(errno)); return -1; } /* get display size */ memset(&buf, 0, sizeof(buf)); if (ioctl(lcdlinux_fd, LCDL_GET_PARAM, &buf) != 0) { error("%s: ioctl(LCDL_GET_PARAM) failed: %s", Name, strerror(errno)); error("%s: Could not query display information!", Name); return -1; } info("%s: %dx%d display with %d controllers, flags=0x%02lx:", Name, buf.cntr_cols, buf.cntr_rows * buf.num_cntr, buf.num_cntr, buf.flags); info("%s: busy-flag checking %sabled", Name, (buf.flags & HD44780_CHECK_BF) ? "en" : "dis"); info("%s: bus width %d bits", Name, (buf.flags & HD44780_4BITS_BUS) ? 4 : 8); info("%s: font size %s", Name, (buf.flags & HD44780_5X10_FONT) ? "5x10" : "5x8"); /* overwrite width size from lcd4linux.conf */ if (buf.vs_rows || buf.vs_cols) { info("%s: disabling virtual screen", Name); buf.vs_rows = 0; buf.vs_cols = 0; commit = 1; } if ((rows > 0 && rows != buf.cntr_rows * buf.num_cntr) || (cols > 0 && cols != buf.cntr_cols)) { info("%s: changing size to %dx%d", Name, cols, rows); buf.cntr_rows = rows / buf.num_cntr; buf.cntr_cols = cols; commit = 1; } DROWS = buf.cntr_rows * buf.num_cntr; DCOLS = buf.cntr_cols; /* overwrite busy-flag checking from lcd4linux.conf */ cfg_number(section, "UseBusy", 0, 0, 1, &use_busy); if (use_busy && !(buf.flags & HD44780_CHECK_BF)) { info("%s: activating busy-flag checking", Name); buf.flags |= HD44780_CHECK_BF; commit = 1; } else if (!use_busy && (buf.flags & HD44780_CHECK_BF)) { info("%s: deactivating busy-flag checking", Name); buf.flags &= ~HD44780_CHECK_BF; commit = 1; } /* overwrite bus length from lcd4linux.conf */ cfg_number(section, "Bus4Bit", 0, 0, 1, &bus4bits); if (bus4bits && !(buf.flags & HD44780_4BITS_BU
All tables are now using DVBv5 format. That allows suporting all standards
available on a standard way.

GENERATING FILES TO THE LEGACY DVBV3 FORMAT
===========================================

A Makefile target is provided to convert to the legacy channel format.
For it to work, you need to have v4l-utils installed (specifically,
the v4l-utils package that contains the dvbv5 utils).

Be sure that you have at least version 1.4.0 installed, or, if you're
compiling v4l-utils from its source. Versions below may work too, but
some DVB files won't be properly parsed with earlier versions.

This is the minimal changeset of v4l-utils required for it to work:
	commit 64751eb98a15b9c0077d8c2e4409b9b69ac80448
	Date:   Fri Sep 5 15:50:43 2014 -0300
	Subject: libdvbv5: make sure that all needed properties are filled

You can download and install v4l-utils from:
	http://git.linuxtv.org/cgit.cgi/v4l-utils.git/

Once having it installed, generating all the tables usind DVBv3 channel
format is as easy as running:

	$ make clean
	$ make dvbv3

The files can also be individually converted from DVBv5 to DVBv3 with:

	$ dvb-format-convert -I dvbv5 -O channel dvb-c/ch-Rega-Sense legacy-format-ch-Rega-Sense

And converting back into DVBv5 format with:

	$ dvb-format-convert -I channel -O dvbv5 legacy-format-ch-Rega-Sense dvb-c/ch-Rega-Sense

Plese notice that comments are not preserved when doing the conversions.

PS.: If you're willing to submit new entries and/or corrections, please
be sure to send them at the DVBv5 format and sending them via e-mail
to linux-media@vger.kernel.org.

INSTALL
=======

In order to install the files, use:
	$ make install

By default, it will install the files at /usr/local/share/dvbv5.

In order to install the legacy v3 formatted files, use:
	$ make install_v3

Don't forget to run "make dvbv3" before running the above command,
in order to convert the files to the legacy format.

By default, it will install the files at /usr/local/share/dvbv3.

There are a few extra parameters that could be used to define where
the files will be stored:

	PREFIX=<dir>		(default: /usr/local)
	DATADIR=<dir>		(default: $(PREFIX/share)
	DVBV5DIR=<subdir>	(default: dvbv3)
	DVBV3DIR=<subdir>	(default: dvbv5)

So, if it is desired to install both v3 and v5 files at a tmp file,
under the current dir, the install command would be:

	$ make install install_v3 PREFIX=`pwd`/tmp
	Installing dvbv5-formatted files at /home/myuser/dtv-scan-tables/tmp/share/dvbv5...done.
	Installing dvbv3-formatted files at /home/myuser/dtv-scan-tables/tmp/share/dvbv3...done.

Please also note that install takes some time, as there are lots
of files to be copied.