Hi,
on the unpatched test9 I get errors and warnings because of this. I took
ir-common.h from test7 and added
"extern IR_KEYTAB_TYPE ir_codes_empty[IR_KEYTAB_SIZE];" from the drivers
2.4.22 ir-common.h to get rid of it.
Since test7 it has to be in /include/media. This has also to be adjusted
for test6 and below were it is in /drivers/media/video.
However with that test6-kraxelpatch1 is fine, but on test9 VIDEO_OVERLAY
and VIDEO_S_CTRL fails, means no unmute and no sound. Guess that is
caused by the unpatched test9-videodev.c without translations for the
old ioctls. (videodev.c-test9-test6.diff attached) Looks like I have to
recompile with videdev.c from test6."4vl2 is in video4linux now" doesn't
work here. Any pointers?
(snapshot has a fix for bttv ir-kbd-gpio error, new opportunity for
testing the remote?)
Hermann
--
/*
* some common structs and functions to handle infrared remotes via
* input layer ...
*
* (c) 2003 Gerd Knorr <kraxel@xxxxxxxxxxx> [SuSE Labs]
*
* 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
*/
#include <linux/version.h>
#include <linux/input.h>
#define IR_TYPE_RC5 1
#define IR_TYPE_OTHER 99
#define IR_KEYTAB_TYPE u32
#define IR_KEYTAB_SIZE 64 // enougth for rc5, probably need more some day ...
#define IR_KEYCODE(tab,code) (((unsigned)code < IR_KEYTAB_SIZE) \
? tab[code] : KEY_RESERVED)
struct ir_input_state {
/* configuration */
int ir_type;
IR_KEYTAB_TYPE ir_codes[IR_KEYTAB_SIZE];
/* key info */
u32 ir_raw; /* raw data */
u32 ir_key; /* ir key code */
u32 keycode; /* linux key code */
int keypressed; /* current state */
};
extern IR_KEYTAB_TYPE ir_codes_rc5_tv[IR_KEYTAB_SIZE];
extern IR_KEYTAB_TYPE ir_codes_empty[IR_KEYTAB_SIZE];
void ir_input_init(struct input_dev *dev, struct ir_input_state *ir,
int ir_type, IR_KEYTAB_TYPE *ir_codes);
void ir_input_nokey(struct input_dev *dev, struct ir_input_state *ir);
void ir_input_keydown(struct input_dev *dev, struct ir_input_state *ir,
u32 ir_key, u32 ir_raw);
u32 ir_extract_bits(u32 data, u32 mask);
/*
* Local variables:
* c-basic-offset: 8
* End:
*/
--- videodev.c-test9 2003-11-19 19:50:54.664928816 +0100
+++ videodev.c-test6 2003-11-19 19:53:29.722356504 +0100
@@ -15,6 +15,7 @@
* - Added procfs support
*/
+#include <linux/version.h>
#include <linux/module.h>
#include <linux/types.h>
#include <linux/kernel.h>
@@ -26,6 +27,7 @@
#include <linux/init.h>
#include <linux/kmod.h>
#include <linux/slab.h>
+#include <linux/types.h>
#include <linux/devfs_fs_kernel.h>
#include <asm/uaccess.h>
#include <asm/system.h>
@@ -50,7 +52,7 @@
{
struct video_device *vfd = container_of(cd, struct video_device, class_dev);
dev_t dev = MKDEV(VIDEO_MAJOR, vfd->minor);
- return print_dev_t(buf,dev);
+ return sprintf(buf,"%04x\n",old_encode_dev(dev));
}
static CLASS_DEVICE_ATTR(name, S_IRUGO, show_name, NULL);
@@ -140,6 +142,30 @@
/*
* helper function -- handles userspace copying for ioctl arguments
*/
+
+static unsigned int
+video_fix_command(unsigned int cmd)
+{
+ switch (cmd) {
+ case VIDIOC_OVERLAY_OLD:
+ cmd = VIDIOC_OVERLAY;
+ break;
+ case VIDIOC_S_PARM_OLD:
+ cmd = VIDIOC_S_PARM;
+ break;
+ case VIDIOC_S_CTRL_OLD:
+ cmd = VIDIOC_S_CTRL;
+ break;
+ case VIDIOC_G_AUDIO_OLD:
+ cmd = VIDIOC_G_AUDIO;
+ break;
+ case VIDIOC_G_AUDOUT_OLD:
+ cmd = VIDIOC_G_AUDOUT;
+ break;
+ }
+ return cmd;
+}
+
int
video_usercopy(struct inode *inode, struct file *file,
unsigned int cmd, unsigned long arg,
@@ -151,12 +177,14 @@
void *parg = NULL;
int err = -EINVAL;
+ cmd = video_fix_command(cmd);
+
/* Copy arguments into temp kernel buffer */
switch (_IOC_DIR(cmd)) {
case _IOC_NONE:
parg = (void *)arg;
break;
- case _IOC_READ: /* some v4l ioctls are marked wrong ... */
+ case _IOC_READ:
case _IOC_WRITE:
case (_IOC_WRITE | _IOC_READ):
if (_IOC_SIZE(cmd) <= sizeof(sbuf)) {
@@ -170,8 +198,9 @@
}
err = -EFAULT;
- if (copy_from_user(parg, (void *)arg, _IOC_SIZE(cmd)))
- goto out;
+ if (_IOC_DIR(cmd) & _IOC_WRITE)
+ if (copy_from_user(parg, (void *)arg, _IOC_SIZE(cmd)))
+ goto out;
break;
}