diff -N -U 5 -p -w -r linux-2.6.18/drivers/media/video/bt8xx/bttv-driver.c linux-2.6.18-lmlbt4x/drivers/media/video/bt8xx/bttv-driver.c --- linux-2.6.18/drivers/media/video/bt8xx/bttv-driver.c 2006-10-19 22:04:35.000000000 +0400 +++ linux-2.6.18-lmlbt4x/drivers/media/video/bt8xx/bttv-driver.c 2006-11-07 19:34:01.000000000 +0300 @@ -2945,10 +2945,105 @@ static int bttv_do_ioctl(struct inode *i case VIDIOC_G_FREQUENCY: case VIDIOC_S_FREQUENCY: case VIDIOC_LOG_STATUS: return bttv_common_ioctls(btv,cmd,arg); + /* BEGIN V4LGX GPIO Extensions *** ******************************** */ + case BTTV_GGPIO: + if (btv->c.type == BTTV_BOARD_LMLBT4) { + int *sensor_value = (int*)arg; + printk(KERN_DEBUG "LMLBT4x read GPIO\n"); + //*sensor_value = 0xAA; + *sensor_value = btread(BT848_GPIO_DATA); + } + else + return -ENOIOCTLCMD; + break; + + case BTTV_SGPIO: + if (btv->c.type == BTTV_BOARD_LMLBT4) { + int *relay_value = (int*)arg; + printk(KERN_DEBUG "LMLBT4x write GPIO = %x\n",*relay_value); + btwrite(*relay_value,BT848_GPIO_DATA); + } + else + return -ENOIOCTLCMD; + break; + + case BTTV_GSENSOR: + if (btv->c.type == BTTV_BOARD_LMLBT4) + { + struct bttv_sa* sensor = (struct bttv_sa*)arg; + int gpioword = btread(BT848_GPIO_DATA); + printk(KERN_DEBUG "LMLBT4x read sensor=%d\n",sensor->item); + sensor->bits = (gpioword >> 2) & 0x00F; /* FIXME - should be a mask */ + sensor->nitems = 4; /* FIXME - should be a property of a card */ + if (sensor->item >= sensor->nitems) + { + return -EINVAL; + } + sensor->avalue = (sensor->bits >> sensor->item) & 1; + } + else + return -ENOIOCTLCMD; + break; + case BTTV_GRELAY: + if (btv->c.type == BTTV_BOARD_LMLBT4) + { + struct bttv_sa* alarm = (struct bttv_sa*)arg; + int gpioword = btread(BT848_GPIO_DATA); + printk(KERN_DEBUG "LMLBT4x read alarm=%d\n",alarm->item); + alarm->bits = ((gpioword >> 6) & 0x003) | ((gpioword >> 7) & 0x004); + /* FIXME - should be a mask */ + alarm->nitems = 3; /* FIXME - should be a property of a card */ + if (alarm->item >= alarm->nitems) + { + return -EINVAL; + } + alarm->avalue = (alarm->bits >> alarm->item) & 1; + } + else + return -ENOIOCTLCMD; + break; + case BTTV_SRELAY: + if (btv->c.type == BTTV_BOARD_LMLBT4) + { + struct bttv_sa* alarm = (struct bttv_sa*)arg; + int gpioword = btread(BT848_GPIO_DATA); + long int alarmBits; + printk(KERN_DEBUG "LMLBT4x write alarm=%d bits=%03lx value=%d\n",alarm->item, + alarm->bits,alarm->avalue); + alarmBits = ((gpioword >> 6) & 0x003) | ((gpioword >> 7) & 0x004); + /* FIXME - should be a mask */ + alarm->nitems = 3; /* FIXME - should be a property of a card */ + if (alarm->item >= alarm->nitems) + { + return -EINVAL; + } + switch (alarm->avalue) + { + case 0: + alarmBits &= ~((long int)1 << alarm->item); + break; + case 1: + alarmBits |= (long int)1 << alarm->item; + break; + case -1: + alarmBits=alarm->bits; + break; + default: + return -EINVAL; + } + gpioword = ((alarmBits & 0x003) << 6) | ((alarmBits & 0x004) << 7); + btwrite(gpioword,BT848_GPIO_DATA); + } + else + return -ENOIOCTLCMD; + break; + /* END V4LGX GPIO Extensions *** ******************************** */ + + default: return -ENOIOCTLCMD; } return 0; diff -N -U 5 -p -w -r linux-2.6.18/include/linux/videodev.h linux-2.6.18-lmlbt4x/include/linux/videodev.h --- linux-2.6.18/include/linux/videodev.h 2006-10-19 22:05:10.000000000 +0400 +++ linux-2.6.18-lmlbt4x/include/linux/videodev.h 2006-11-07 18:16:30.000000000 +0300 @@ -226,10 +226,23 @@ struct video_code char loadwhat[16]; /* name or tag of file being passed */ int datasize; __u8 *data; }; +/* --------- Alarms/sensor I/O structure */ +struct bttv_sa { + int item; /* 0,1,...item-1; alarm to work on */ + int nitems; /* number of items; for Get only */ + long int bits; /* MSB ... i2 i1 i0 <-LSB */ + int avalue; /* for Get returns status of item + for Set (for alarms only): + -1 - assign from bits, + 0 - set alarm_no OFF, + 1 - set alarm_no ON */ +}; + + #define VIDIOCGCAP _IOR('v',1,struct video_capability) /* Get capabilities */ #define VIDIOCGCHAN _IOWR('v',2,struct video_channel) /* Get channel info (sources) */ #define VIDIOCSCHAN _IOW('v',3,struct video_channel) /* Set channel */ #define VIDIOCGTUNER _IOWR('v',4,struct video_tuner) /* Get tuner abilities */ #define VIDIOCSTUNER _IOW('v',5,struct video_tuner) /* Tune the tuner for the current channel */ @@ -259,10 +272,18 @@ struct video_code #define VIDIOCSVBIFMT _IOW('v',29, struct vbi_format) /* Set VBI information */ #define BASE_VIDIOCPRIVATE 192 /* 192-255 are private */ +#define BTTV_SGPIO _IOW('v', BASE_VIDIOCPRIVATE+44, int) +#define BTTV_GGPIO _IOR('v', BASE_VIDIOCPRIVATE+45, int) + +#define BTTV_SRELAY _IOW('v', BASE_VIDIOCPRIVATE+46, struct bttv_sa) +#define BTTV_GRELAY _IOWR('v', BASE_VIDIOCPRIVATE+47, struct bttv_sa) + +#define BTTV_GSENSOR _IOWR('v', BASE_VIDIOCPRIVATE+48, struct bttv_sa) + /* VIDIOCSWRITEMODE */ #define VID_WRITE_MPEG_AUD 0 #define VID_WRITE_MPEG_VID 1 #define VID_WRITE_OSD 2 #define VID_WRITE_TTX 3