Hi,
In case anyone is interested, I've written a lirc driver for the receiver
that
come with the Zalman Hd135 which appears to be a Vlsys Mplay Blast.
I join the driver and a patch for lirc-0.8.2 (configure.in,
daemons/Makefile.am
and daemons/hw-types.c) and my lircd.conf for this remote.
I don't know how to add my driver to the lirc configuration interface. If any
body can explain it to me, I will do it with pleasure.
I hope this helps someone out,
Benoit
# Please make this file available to others
# by sending it to <
lirc@...>
#
# this config file was automatically generated
# using lirc-0.8.2(mplay) on Fri Dec 7 20:04:59 2007
#
# contributed by
#
# brand: /etc/lircd.conf
# model no. of remote control:
# devices being controlled by this remote:
#
begin remote
name /etc/lircd.conf
bits 8
eps 30
aeps 100
one 0 0
zero 0 0
gap 211938
toggle_bit_mask 0x0
begin codes
PwrOff 0x41
PwrOn 0x55
Movies 0x40
Television 0x46
Pictures 0x45
Music 0x56
1 0x4d
2 0x4e
3 0x4f
4 0x50
5 0x51
6 0x52
7 0x53
8 0x03
9 0x07
0 0x4c
Vol+ 0x0a
Vol- 0x0e
Ch+_Lang 0x12
Ch-_Page 0x16
Guide 0x0f
Back 0x0b
Tv 0x13
Ok 0x42
Up 0x19
Left 0x54
Right 0x43
Down 0x1d
Exit_Click 0x1f
Task_Quick 0x17
Run_DClick 0x1b
Rew 0x0d
Play 0x09
Ffwd 0x15
Prev 0x1a
Stop 0x01
Next 0x1e
Pause 0x05
Mute 0x4a
Warp_Mouse 0x47
Rec 0x11
DVD_Zoom 0x14
Detail 0x4b
end codes
end remote
---------------
/****************************************************************************
** hw_mplay.h ************************************************************
****************************************************************************
*
* LIRC driver for Vlsys mplay usb ftdi serial port remote control.
*
* Author: Benoit Laurent <
ben905@...>
*
* 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
#ifndef _HW_MPLAY_H
#define _HW_MPLAY_H
#include "drivers/lirc.h"
extern int mplay_decode(struct ir_remote *remote,
ir_code *prep,
ir_code *codep,
ir_code *postp,
int *repeat_flagp,
lirc_t *remaining_gapp);
//int mplay_open_serial_port(char *device);
extern int mplay_init(void);
extern int mplay_deinit(void);
extern char *mplay_rec(struct ir_remote *remotes);
#endif
----------
/****************************************************************************
** hw_mplay.c **************************************************************
****************************************************************************
*
* LIRC driver for Vlsys mplay usb ftdi serial port remote control.
*
* Driver inspire from hw_accent et hw_alsa_usb.
*
* Copyright (c) 2007 Benoit Laurent <
ben905@...>
*
* 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/* Functions available for logging (see tools/lircrcd.c).
*
* NOTE: if compiled without the DEBUG option and with SYSLOG,
* you cannot control the amount of debug info sent to syslog,
* even the LOG_DEBUG messages will be logged.
*
* void logprintf(int priority, char *format, ...)
* Calls the syslog(3) function.
*
* void logperror(int priority, char *s)
* Uses the syslog(3) to print a message followed by the error message
* strerror (%m) associated to the present errno.
*
* void LOGPRINTF(int priority, char *format, ...)
* Calls logprintf(), but only if compiled with DEBUG option.
*
* void LOGPERROR(int priority, char *s)
* Calls logperror(), but only if compiled with DEBUG option.
*/
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
#include <stdio.h>
#include <sys/types.h>
#include <fcntl.h>
#include <termios.h>
#include "lircd.h"
#include "hardware.h"
#include "serial.h"
#include "hw_mplay.h"
// The mplay code length in bit
#define MPLAY_CODE_LENGTH 8
// Code value send by the mplay to indicate a repeatition of the last code
#define MPLAY_REPEAT_CODE 0x7e
// Mplay serial baud rate
#define MPLAY_BAUD_RATE 38400
//-------------------------------------------------------------------------
// Definition of local struct that permit to save data from call to call
// of the driver.
//-------------------------------------------------------------------------
static struct {
// the last receive code
ir_code rc_code;
// Int wich indicate that the last reception was a repetition
int repeat_flag;
} mplay_local_data = {
0,
0
};
//-------------------------------------------------------------------------
// Definition of the standard internal hardware interface
// use by lirc for the mplay device
//-------------------------------------------------------------------------
struct hardware hw_mplay = {
LIRC_DRIVER_DEVICE, /* default device */
-1, /* fd */
LIRC_CAN_REC_CODE, /* features */
0, /* send_mode */
LIRC_MODE_CODE, /* rec_mode */
MPLAY_CODE_LENGTH, /* code_length */
mplay_init, /* init_func */
NULL, /* config_func */
mplay_deinit, /* deinit_func */
NULL, /* send_func */
mplay_rec, /* rec_func */
mplay_decode, /* decode_func */
NULL, /* ioctl_func */
NULL, /* readdata */
"mplay"
};
//-------------------------------------------------------------------------
// Lock and initialize the serial port.
// This function is called by the LIRC daemon when the first client
// registers itself.
// Return 1 on success, 0 on error.
//-------------------------------------------------------------------------
int mplay_init(void)
{
int result = 1;
LOGPRINTF(LOG_DEBUG, "Entering mplay_init()");
// Creation of a lock file for the port
if (!tty_create_lock(hw.device)) {
logprintf(LOG_ERR, "Could not create the lock file");
LOGPRINTF(LOG_EMERG, "Could not create the lock file");
result = 0;
}
// Try to open serial port
else if ((hw.fd = open (hw.device, O_RDWR | O_NONBLOCK | O_NOCTTY)) < 0) {
logprintf(LOG_ERR, "Could not open the serial port");
LOGPRINTF(LOG_EMERG, "Could not open the serial port");
mplay_deinit();
result = 0;
}
// Serial port configuration
else if (!tty_reset(hw.fd) || !tty_setbaud(hw.fd, MPLAY_BAUD_RATE))
{
logprintf(LOG_ERR, "could not configure the serial port for "
"'%s'", hw.device);
LOGPRINTF(LOG_EMERG, "could not configure the serial port for "
"'%s'", hw.device);
mplay_deinit();
}
return(result);
}
//-------------------------------------------------------------------------
// Close and release the serial line.
//-------------------------------------------------------------------------
int mplay_deinit(void)
{
LOGPRINTF(LOG_DEBUG, "Entering mplay_deinit()");
close(hw.fd);
tty_delete_lock();
return(1);
}
//-------------------------------------------------------------------------
// Receive a code (1 byte) from the remote.
// This function is called by the LIRC daemon when I/O is pending
// from a registered client, e.g. irw.
//
// return ???????
//-------------------------------------------------------------------------
char *mplay_rec(struct ir_remote *remotes)
{
unsigned char rc_code;
LOGPRINTF(LOG_DEBUG, "Entering mplay_rec()");
if (read(hw.fd, &rc_code, 1) == -1)
{
return NULL;
}
else
{
if (rc_code == MPLAY_REPEAT_CODE)
{
// This reception is a repeat
mplay_local_data.repeat_flag = 1;
}
else
{
// This is a new code
mplay_local_data.rc_code = rc_code;
mplay_local_data.repeat_flag = 0;
}
LOGPRINTF(1, "code: %u", (unsigned int) mplay_local_data.rc_code);
LOGPRINTF(1, "repeat_flag: %d", mplay_local_data.repeat_flag);
return decode_all(remotes);
}
}
//-------------------------------------------------------------------------
// This function is called by the LIRC daemon during the transform of a
// received code into an lirc event.
//
// It gets the global variable code (remote keypress code).
//
// It returns:
// prep Code prefix (zero for this LIRC driver)
// codep Code of keypress
// postp Trailing code (zero for this LIRC dirver)
// repeat_flagp True if the keypress is a repeated keypress
// remaining_gapp Extimated time gap remaining before next code?
//-------------------------------------------------------------------------
int mplay_decode(
struct ir_remote *remote,
ir_code *prep,
ir_code *codep,
ir_code *postp,
int *repeat_flagp,
lirc_t *remaining_gapp)
{
LOGPRINTF(LOG_DEBUG, "Entering mplay_decode(), code = %u\n",
(unsigned int)mplay_local_data.rc_code);
if(!map_code(
remote,
prep,
codep,
postp,
0,
0,
MPLAY_CODE_LENGTH,
mplay_local_data.rc_code,
0, 0))
{
return(0);
}
*repeat_flagp = mplay_local_data.repeat_flag;
*remaining_gapp = 0;
return 1;
}
------------
--- lirc-0.8.2-original/configure.in 2007-06-09 20:54:09.000000000 +0200
+++ lirc-0.8.2/configure.in 2007-12-07 16:52:24.000000000 +0100
@@ -145,6 +145,7 @@
(mediafocusI) \
(mouseremote) \
(mouseremote_ps2) \
+ (mplay) \
(mp3anywhere) \
(pcmak) \
(pcmak_usb) \
@@ -274,7 +275,7 @@
leadtek_0007, leadtek_0010, leadtek_pvr2000,
livedrive_midi, livedrive_seq, logitech,
lptX, macmini, mceusb, mceusb2, mediafocusI,
- mouseremote, mouseremote_ps2, mp3anywhere,
+ mouseremote, mouseremote_ps2, mplay, mp3anywhere,
nslu2,packard_bell, parallel, pcmak,
pcmak_usb, pctv, pixelview_bt878,
pixelview_pak, pixelview_pro, provideo,
@@ -443,6 +444,9 @@
mouseremote_ps2)
hw_module="${hw_module} hw_mouseremote.o serial.o"
;;
+ mplay)
+ hw_module="${hw_module} hw_mplay.o serial.o"
+ ;;
mp3anywhere)
hw_module="${hw_module} hw_mp3anywhere.o serial.o"
;;
@@ -936,6 +940,13 @@
lircmd_conf="x10/lircmd.conf.mouseremote"
fi
+if test "$driver" = "mplay"; then
+ lirc_driver="none"
+ hw_module="hw_mplay.o serial.o"
+ HW_DEFAULT="hw_mplay"
+# lircd_conf="x10/lircd.conf.mp3anywhere"
+fi
+
if test "$driver" = "mp3anywhere"; then
lirc_driver="none"
hw_module="hw_mp3anywhere.o serial.o"
--- lirc-0.8.2-original/daemons/Makefile.am 2007-05-06 11:46:59.000000000
+0200
+++ lirc-0.8.2/daemons/Makefile.am 2007-12-07 16:25:59.000000000 +0100
@@ -36,6 +36,7 @@
hw_livedrive_midi.c hw_livedrive_seq.c \
hw_logitech.c hw_logitech.h \
hw_mouseremote.c hw_mouseremote.h \
+ hw_mplay.c hw_mplay.h \
hw_mp3anywhere.c hw_mp3anywhere.h \
hw_pcmak.c hw_pcmak.h \
hw_pinsys.c hw_pinsys.h \
@@ -84,6 +85,7 @@
hw_livedrive_midi.c hw_livedrive_seq.c \
hw_logitech.c hw_logitech.h \
hw_mouseremote.c hw_mouseremote.h \
+ hw_mplay.c hw_mplay.h \
hw_mp3anywhere.c hw_mp3anywhere.h \
hw_pcmak.c hw_pcmak.h \
hw_pinsys.c hw_pinsys.h \
--- lirc-0.8.2-original/daemons/hw-types.c 2007-05-05 14:20:03.000000000 +0200
+++ lirc-0.8.2/daemons/hw-types.c 2007-12-07 15:49:46.000000000 +0100
@@ -7,6 +7,7 @@
#include "hw-types.h"
/* Hardware types */
extern struct hardware hw_accent;
+extern struct hardware hw_mplay;
extern struct hardware hw_alsa_usb;
extern struct hardware hw_asusdh;
extern struct hardware hw_atilibusb;
@@ -72,6 +73,7 @@
{
#ifdef LIRC_DRIVER_ANY
&hw_accent,
+ &hw_mplay,
#ifdef HAVE_ALSA_SB_RC
&hw_alsa_usb,
#endif
-------------------------------------------------------------------------
SF.Net email is sponsored by:
Check out the new SourceForge.net Marketplace.
It's the best place to buy or sell services for
just about anything Open Source.
http://sourceforge.net/services/buy/index.php