diff options
author | Mauro Carvalho Chehab <mchehab@infradead.org> | 2006-07-31 20:22:52 -0300 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@infradead.org> | 2006-07-31 20:22:52 -0300 |
commit | 54e91faabed65dbc999715acfe8f0d9b939e851c (patch) | |
tree | 578939d9944ff55e0cb2f60bccfc8bf8b2acf9d6 /linux/drivers/media | |
parent | 2dcd1c6ea61715a687a67df41fe1a5d64797eb91 (diff) | |
download | mediapointer-dvb-s2-54e91faabed65dbc999715acfe8f0d9b939e851c.tar.gz mediapointer-dvb-s2-54e91faabed65dbc999715acfe8f0d9b939e851c.tar.bz2 |
V4L2 conversion: dsbr100
From: Mauro Carvalho Chehab <mchehab@infradead.org>
Driver conversion to V4L2 API.
Not tested yet.
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
Diffstat (limited to 'linux/drivers/media')
-rw-r--r-- | linux/drivers/media/radio/Kconfig | 4 | ||||
-rw-r--r-- | linux/drivers/media/radio/dsbr100.c | 165 |
2 files changed, 110 insertions, 59 deletions
diff --git a/linux/drivers/media/radio/Kconfig b/linux/drivers/media/radio/Kconfig index 57b754ad3..7015517e2 100644 --- a/linux/drivers/media/radio/Kconfig +++ b/linux/drivers/media/radio/Kconfig @@ -352,7 +352,7 @@ config RADIO_ZOLTRIX_PORT config USB_DSBR tristate "D-Link USB FM radio support (EXPERIMENTAL)" - depends on USB && VIDEO_V4L1 && EXPERIMENTAL + depends on USB && VIDEO_V4L2 && EXPERIMENTAL ---help--- Say Y here if you want to connect this type of radio to your computer's USB port. Note that the audio is not digital, and @@ -361,6 +361,4 @@ config USB_DSBR To compile this driver as a module, choose M here: the module will be called dsbr100. - endmenu - diff --git a/linux/drivers/media/radio/dsbr100.c b/linux/drivers/media/radio/dsbr100.c index 45d2b5028..f9fbb2020 100644 --- a/linux/drivers/media/radio/dsbr100.c +++ b/linux/drivers/media/radio/dsbr100.c @@ -33,8 +33,11 @@ History: + Version 0.41: + Converted to V4L2 API by Mauro Carvalho Chehab <mchehab@infradead.org> + Version 0.40: - Markus: Updates for 2.6.x kernels, code layout changes, name sanitizing + Markus: Updates for 2.6.x kernels, code layout changes, name sanitizing Version 0.30: Markus: Updates for 2.5.x kernel and more ISO compliant source @@ -65,14 +68,13 @@ */ - #include <linux/kernel.h> #include <linux/module.h> #include <linux/init.h> #include <linux/slab.h> #include <linux/input.h> #include "compat.h" -#include <linux/videodev.h> +#include <linux/videodev2.h> #include <media/v4l2-common.h> #include <linux/usb.h> #include <linux/smp_lock.h> @@ -80,7 +82,22 @@ /* * Version Information */ -#define DRIVER_VERSION "v0.40" +#include <linux/version.h> /* for KERNEL_VERSION MACRO */ + +#define DRIVER_VERSION "v0.41" +#define RADIO_VERSION KERNEL_VERSION(0,4,1) + +static struct v4l2_queryctrl radio_qctrl[] = { + { + .id = V4L2_CID_AUDIO_MUTE, + .name = "Mute", + .minimum = 0, + .maximum = 1, + .default_value = 1, + .type = V4L2_CTRL_TYPE_BOOLEAN, + } +}; + #define DRIVER_AUTHOR "Markus Demleitner <msdemlei@tucana.harvard.edu>" #define DRIVER_DESC "D-Link DSB-R100 USB FM radio driver" @@ -120,6 +137,7 @@ typedef struct { int stereo; int users; int removed; + int muted; } dsbr100_device; @@ -139,7 +157,6 @@ static struct video_device dsbr100_videodev_template= .owner = THIS_MODULE, .name = "D-Link DSB-R 100", .type = VID_TYPE_TUNER, - .hardware = VID_HARDWARE_AZTECH, .fops = &usb_dsbr100_fops, .release = video_device_release, }; @@ -173,6 +190,7 @@ static int dsbr100_start(dsbr100_device *radio) USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_IN, 0x01, 0x00, radio->transfer_buffer, 8, 300)<0) return -1; + radio->muted=0; return (radio->transfer_buffer)[0]; } @@ -189,6 +207,7 @@ static int dsbr100_stop(dsbr100_device *radio) USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_IN, 0x00, 0x00, radio->transfer_buffer, 8, 300)<0) return -1; + radio->muted=1; return (radio->transfer_buffer)[0]; } @@ -298,80 +317,112 @@ static int usb_dsbr100_do_ioctl(struct inode *inode, struct file *file, return -EIO; switch(cmd) { - case VIDIOCGCAP: { - struct video_capability *v = arg; - - memset(v, 0, sizeof(*v)); - v->type = VID_TYPE_TUNER; - v->channels = 1; - v->audios = 1; - strcpy(v->name, "D-Link R-100 USB FM Radio"); + case VIDIOC_QUERYCAP: + { + struct v4l2_capability *v = arg; + memset(v,0,sizeof(*v)); + strlcpy(v->driver, "dsbr100", sizeof (v->driver)); + strlcpy(v->card, "D-Link R-100 USB FM Radio", sizeof (v->card)); + sprintf(v->bus_info,"ISA"); + v->version = RADIO_VERSION; + v->capabilities = V4L2_CAP_TUNER; + return 0; } - case VIDIOCGTUNER: { - struct video_tuner *v = arg; + case VIDIOC_G_TUNER: + { + struct v4l2_tuner *v = arg; - dsbr100_getstat(radio); - if(v->tuner) /* Only 1 tuner */ + if (v->index > 0) return -EINVAL; + + dsbr100_getstat(radio); + + memset(v,0,sizeof(*v)); + strcpy(v->name, "FM"); + v->type = V4L2_TUNER_RADIO; + v->rangelow = FREQ_MIN*FREQ_MUL; v->rangehigh = FREQ_MAX*FREQ_MUL; - v->flags = VIDEO_TUNER_LOW; - v->mode = VIDEO_MODE_AUTO; + + + v->rxsubchans =V4L2_TUNER_SUB_MONO|V4L2_TUNER_SUB_STEREO; + v->capability=V4L2_TUNER_CAP_LOW; + if(radio->stereo) + v->audmode = V4L2_TUNER_MODE_STEREO; + else + v->audmode = V4L2_TUNER_MODE_MONO; v->signal = radio->stereo*0x7000; - /* Don't know how to get signal strength */ - v->flags |= VIDEO_TUNER_STEREO_ON*radio->stereo; - strcpy(v->name, "DSB R-100"); - return 0; - } - case VIDIOCSTUNER: { - struct video_tuner *v = arg; - if(v->tuner!=0) - return -EINVAL; - /* Only 1 tuner so no setting needed ! */ return 0; } - case VIDIOCGFREQ: { - int *freq = arg; + case VIDIOC_S_TUNER: + { + struct v4l2_tuner *v = arg; - if (radio->curfreq==-1) + if (v->index > 0) return -EINVAL; - *freq = radio->curfreq; + return 0; } - case VIDIOCSFREQ: { - int *freq = arg; + case VIDIOC_S_FREQUENCY: + { + struct v4l2_frequency *f = arg; - radio->curfreq = *freq; + radio->curfreq = f->frequency; if (dsbr100_setfreq(radio, radio->curfreq)==-1) warn("Set frequency failed"); return 0; } - case VIDIOCGAUDIO: { - struct video_audio *v = arg; - - memset(v, 0, sizeof(*v)); - v->flags |= VIDEO_AUDIO_MUTABLE; - v->mode = VIDEO_SOUND_STEREO; - v->volume = 1; - v->step = 1; - strcpy(v->name, "Radio"); + case VIDIOC_G_FREQUENCY: + { + struct v4l2_frequency *f = arg; + + f->type = V4L2_TUNER_RADIO; + f->frequency = radio->curfreq; + return 0; } - case VIDIOCSAUDIO: { - struct video_audio *v = arg; + case VIDIOC_QUERYCTRL: + { + struct v4l2_queryctrl *qc = arg; + int i; + + for (i = 0; i < ARRAY_SIZE(radio_qctrl); i++) { + if (qc->id && qc->id == radio_qctrl[i].id) { + memcpy(qc, &(radio_qctrl[i]), + sizeof(*qc)); + return (0); + } + } + return -EINVAL; + } + case VIDIOC_G_CTRL: + { + struct v4l2_control *ctrl= arg; - if (v->audio) - return -EINVAL; - if (v->flags&VIDEO_AUDIO_MUTE) { - if (dsbr100_stop(radio)==-1) - warn("Radio did not respond properly"); + switch (ctrl->id) { + case V4L2_CID_AUDIO_MUTE: + ctrl->value=radio->muted; } - else - if (dsbr100_start(radio)==-1) - warn("Radio did not respond properly"); - return 0; + return -EINVAL; + } + case VIDIOC_S_CTRL: + { + struct v4l2_control *ctrl= arg; + + switch (ctrl->id) { + case V4L2_CID_AUDIO_MUTE: + if (ctrl->value) { + if (dsbr100_stop(radio)==-1) + warn("Radio did not respond properly"); + } else { + if (dsbr100_start(radio)==-1) + warn("Radio did not respond properly"); + } + return (0); + } + return -EINVAL; } default: return -ENOIOCTLCMD; @@ -389,6 +440,8 @@ static int usb_dsbr100_open(struct inode *inode, struct file *file) dsbr100_device *radio=video_get_drvdata(video_devdata(file)); radio->users = 1; + radio->muted = 1; + if (dsbr100_start(radio)<0) { warn("Radio did not start up properly"); radio->users = 0; |